Activerecord 如何使用Rails 4强参数与has_many:通过关联?

Activerecord 如何使用Rails 4强参数与has_many:通过关联?,activerecord,many-to-many,ruby-on-rails-4,strong-parameters,Activerecord,Many To Many,Ruby On Rails 4,Strong Parameters,通过与Rails 4的强参数的关联,我很难获得一个has_许多。我有一个名为Checkout的模型,我需要在新的结帐表单中从Employee模型中选择一个人。签出和员工通过就业模型关联 尝试创建新签出时出现此错误: NoMethodError in CheckoutsController#create undefined method `employee' for #<Checkout:0x007ff4f8d07f88> 我的结账参数: def checkout_params

通过与Rails 4的强参数的关联,我很难获得一个has_许多。我有一个名为
Checkout
的模型,我需要在新的结帐表单中从
Employee
模型中选择一个人。签出和员工通过
就业
模型关联

尝试创建新签出时出现此错误:

NoMethodError in CheckoutsController#create
undefined method `employee' for #<Checkout:0x007ff4f8d07f88>
我的结账参数:

def checkout_params
      params.require(:checkout).permit(:job, :employee_ids, :shift, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end
我的新结账表:

<div class="field">
     <%= f.label :employee %><br>
     <%= f.collection_select(:employee_ids, Employee.all.collect, :id, :full_name, {:prompt => "Please select"} ) %>
</div>


“请选择”})%%>
但是我不知道Rails 4和strong参数发生了什么变化。在Rails3中,这种类型的关联和表单使用attr\u accessible而不是strong\u参数为我工作

相关文件

错误的完整跟踪:

models/checkout.rb:

控制器/签出\u controller.rb:

视图/签出/_form.html.erb

models/employee.rb:

控制器/员工\u controller.rb:

models/employment.rb:

db/schema.rb:

我可以在我的一个控制器中发布我使用的许可声明。这也有多对多的关联。嵌套许可证数组。在许可证声明中使用查找关联。唯一的区别应该是你的不会被第三次嵌套

就我而言,协会 引用
有很多:引用项目

QuoteItems
有许多:quote\u选项,通过=>quote\u项目\u quote\u选项

在quotes_controller.rb中

params.require(:quote).permit(:quote_date, :good_through, :quote_number, quote_items_attributes: [:id,:quote_id, :item_name, :material_id, quote_item_quote_options_attributes:[:quote_option_id,:quote_item_id,:qty,:_destroy,:id]])

请记住,您为强参数(employee、employee_ID等)指定的名称在很大程度上是不相关的,因为它取决于您选择提交的名称。基于命名约定,强参数没有“魔力”

之所以对“employee_ID”抛出“Unpermitted parameter”错误,是因为它需要标量值的数组,而不仅仅是标量值

# If instead of:
... "employee_ids" => "1" ...
# You had:
... "employee_ids" => ["1"]
然后,您的强参数将起作用,特别是:

... { :employee_ids => [] } ...

因为它接收的是一个标量值数组,而不仅仅是一个标量值。

好的,所以我实际上不需要嵌套参数。这就是最终对我起作用的原因:

# If instead of:
... "employee_ids" => "1" ...
# You had:
... "employee_ids" => ["1"]
# Never trust parameters from the scary internet, only allow the white list through.
def checkout_params
  params.require(:checkout).permit(:job, :shift, :employee_ids, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end
以下是有效的变化组合

  • db/schema.rb-
  • 控制器/签出\u controller.rb-
  • 控制器/员工\u controller.rb-
  • models/checkout.rb-
  • models/employee.rb-
  • models/employment.rb-
  • 视图/签出/_form.html.erb-
  • 视图/签出/index.html.erb-
  • 视图/签出/show.html.erb-

但仍然不太明白为什么会这样。

也有同样的问题。我认为问题在于,collection select不只是提交员工id,而是将其包装在散列中。在您的例子中,“employee_id”=>{“employee_id”=>“1”,“employee_id”=>“1”}。我敢打赌,如果你查看日志,会有一行写着“未经许可的参数:员工ID”或类似内容。我认为这是正确的方向。这是我的开发日志:现在如何解决这个问题?我将我的checkout_参数更新为这个参数,现在我得到了一个
不允许的参数,正如您在这里看到的那样:好的,基于此,似乎这对我应该有效
params.require(:checkout.permited)(:job,:shift,:date,:hours,:sales,:tips,:owed,:collected,:notes,employees\u attributes:[:id,:first\u name,:last\u name,:number])
,但我仍然得到一个未定义的方法“employeer”
error。我已经尝试了所有这些变体,但仍然得到了错误:。根据强大的params文档,似乎我可以使用
{:employees=>[]}
,但这也不起作用。因为你没有提交id列表…请参考我之前的解释。哦,所以在这个线程的开头,我试图提交
:employee\u id
,而它应该是
:employee\u id
。我从来都不需要嵌套属性,对吗?正确,除了命名,你永远不需要由于您只提交了一个标量值,因此需要嵌套属性。