Ruby on rails 嵌套属性中不允许的参数

Ruby on rails 嵌套属性中不允许的参数,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我已经看过了每一篇我能想象到的关于这个的帖子,但是找不到一个解决方案。我有一个任务,任务产品的嵌套资源从另一个数据库获取它的ID。一个任务中可以嵌套多个任务产品,每个任务产品都是使用一些Javascript和应用程序帮助程序动态创建的,这两者都是我的复制/粘贴 我在/和的帮助下为这些嵌套参数构建了代码。下面是所有相关代码,然后是问题: task.rb: class Task < ApplicationRecord has_many :task_products, :dependent

我已经看过了每一篇我能想象到的关于这个的帖子,但是找不到一个解决方案。我有一个任务,任务产品的嵌套资源从另一个数据库获取它的ID。一个任务中可以嵌套多个任务产品,每个任务产品都是使用一些Javascript和应用程序帮助程序动态创建的,这两者都是我的复制/粘贴

我在/和的帮助下为这些嵌套参数构建了代码。下面是所有相关代码,然后是问题:

task.rb:

class Task < ApplicationRecord
  has_many :task_products, :dependent => :destroy
  accepts_nested_attributes_for :task_products, :reject_if => lambda { |p| p.values.all?(&:blank?) }, :allow_destroy => true
end
application.js:

$(function() {
  $('form a.add_child').click(function() {
    var association = $(this).attr('data-association');
    var template = $('#' + association + '_fields_template').html();
    var regexp = new RegExp('new_' + association, 'g');
    var new_id = new Date().getTime();
    $(this).parent().before(template.replace(regexp, new_id));
    return false;
  });
});
_form.html.erb:

<%= form_for @task, url: tasks_path, method: :post, :html => {:multipart => true } do |f| %>
    <%= f.fields_for :task_products, TaskProduct.new do |builder| %>
      <%= render "task_product", :f => builder %>
    <% end %>
    <p><%= add_child_link "Add Product", :task_products %></p>
    <%= new_child_fields_template f, :task_products %>
<div class="fields">
  <div class="form-group">
    <%= f.label :product_id, "Product:", class: 'col-sm-3 control-label' %>
      <%= f.collection_select(:product_id, @items, :id, :item_select, {:include_blank => 'Select Item...'}, {:class => 'form-control'}) %>
      <%= remove_child_link "Remove Product", f %>
  </div>
</div>
生成的HTML错误示例生成多个生成选择的代码:

<select class="form-control" name="task[task_products_attributes][0][product_id]" id="task_task_products_attributes_0_product_id">
<select class="form-control" name="task[task_products_attributes][1484794199756][product_id]" id="task_task_products_attributes_1484794199756_product_id">
还有它的模板,我认为应该在控制台中抛出“\u destroy=>true”:

<select class="form-control" name="task[task_products_attributes][new_task_products][product_id]" id="task_task_products_attributes_new_task_products_product_id">
如上所述,问题在于我生成的任务产品表单添加了一个额外的括号内的identifierchild索引?我不知道如何深入到应用程序帮助程序中删除它,或者将它移动到它所属的位置。还是它真的属于那里而我又做错了什么?我觉得每个单独的任务产品都应该有自己的唯一标识符,但是Rails没有,并且说它是不允许的


Application Helper中的“new_child_fields_template”(新的\u child_fields_模板)有点让我摸不着头脑,虽然我知道它是如何将唯一标识符注入到我的任务产品表单中的,但我不知道它是如何将其扔到我的select的name=字段中的,这显然把一切都搞糟了。有人对我如何克服这个问题有一些指导吗?谢谢

要使嵌套属性与强属性协同工作,需要将id和_destroy属性传递给属性列表。在您的任务_controller.rb中:

class TasksController < ApplicationController

  def new
    @task = Task.new
    @task.task_products.build
  end

    def task_params
  params.require(:task).permit(:id, :task_name, . . ., :created_at, :updated_at, 
                               :task_products_attributes => [:task_id, :product_id, :created_at, :updated_at])
end

要获得更清楚的解释,您可以转到这里。

最后一条评论,除非有人对为什么在嵌套参数中包含:id不起作用有任何其他意见

通过将允许的参数更改为

params.require(:task).permit!  
这显然是对任何碰巧落入:task参数的内容的全面许可,不管它是否嵌套。我想这是不推荐的,但是它的网站对很少的团队成员是封闭的,所以我认为这不应该是一个问题?此外,我仍在寻找新任务产品的模板为什么没有给我一个destroy=>1,因为产品id是空的。这个代码不正确吗

accepts_nested_attributes_for :task_products, 
    :reject_if => lambda { |p| p.values.all?(&:blank?) },
    :allow_destroy => true

我可能会尝试将模板移动到视图之外的某个位置,以避免出现问题。感谢大家的帮助

我相信我可能对你所说的隐藏场也有类似的问题。CTRL+F并搜索此页面上隐藏的include_:http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html. 您可以在“集合”复选框中将其用作参数集合\复选框:对象、:字段、[opts]、:方法1、:方法2、{include\ hidden:false}&block看看这是否有帮助@maxple,谢谢你的链接,以后会有用的!但我不认为这是我想要实现的。从Application Helper生成的代码将向select下拉列表的name字段中添加一个附加值,并尝试将其作为表单的值传递。我不需要将其作为值传递。我需要做的就是确保任务产品链接到任务,我认为它是自动发生的任务的一部分,所以我想我需要做的就是找出如何去掉“名称”列中第二个括号内的项。@Shiyason,谢谢你的回答,但这不是隐藏字段的问题。只是为了好玩,我添加了include_hidden子句,但它并没有改变未经允许的错误。你说从另一个数据库获取其ID是什么意思?你真的是指另一个数据库或另一个表吗?你可以使用友好生成的字段,这样你就不会像这样忘记任何内容:task_products_attributes:[:\u destroy]+TaskProducts.column_names.map&:to_sym@zamakkat然后我真的很困惑,因为我已经做到了这一点,你链接的帖子描述了与我完全相同的问题,但未经许可的参数问题仍然存在。这令人难以置信地沮丧,因为我不知道是什么阻止了它的工作,我已经考虑了我能想到的所有可能的解决方案。澄清:这就是我的params.require现在的要求,它仍然会抛出0=>等的未经允许的错误。参数::任务产品属性:[:product\u id、:task\u id、:created\u at、:updated\u at、:id、:\u destroy]///////////////task\u products\u attributes=>{0=>{product\u id=>2、\u destroy=>false}、1484881558666=>{product id=>3、\u destroy=>false}、新的任务产品=>{product id=>2、\u destroy=>false},…未经允许的参数:0,1484881558666,新的任务产品为什么在 我的情人?你能不能把id移到乞讨者那里,让你的参数看起来像这样::id,:product\u id,:\u destroy。看看这是否有效。。。
params.require(:task).permit(
    task_products_attributes: [
        :id, :product_id, :created_at, :updated_at, :_destroy
    ]
)
params.require(:task).permit!  
accepts_nested_attributes_for :task_products, 
    :reject_if => lambda { |p| p.values.all?(&:blank?) },
    :allow_destroy => true