我无法获得has_many:通过使用Rails 4强大参数的关联。我有一个名为Checkout
的模型,我需要在新的结帐表单中从Employee
模型中选择一个人。结帐和员工通过Employment
模式关联。
当我尝试创建新的结帐时,我收到此错误:
NoMethodError in CheckoutsController#create
undefined method `employee' for #<Checkout:0x007ff4f8d07f88>
我的创建操作,结帐参数或新的结帐表单似乎有问题。这是创建动作:
def create
@user = current_user
@checkout = @user.checkouts.build(checkout_params)
respond_to do |format|
if @checkout.save
format.html { redirect_to @checkout, notice: 'Checkout was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
我的结帐参数:
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和强参数的变化。在Rails 3中,这种类型的关联和形式使用attr_accessible而不是strong_parameters为我工作。
相关文件
完整跟踪错误: https://gist.github.com/leemcalilly/0cb9e2b539f9e1925a3d
模型/ checkout.rb: https://gist.github.com/leemcalilly/012d6eae6b207beb147a
控制器/ checkouts_controller.rb: https://gist.github.com/leemcalilly/a47466504b7783b31773
视图/检出/ _form.html.erb https://gist.github.com/leemcalilly/ce0b4049b23e3d431f55
模型/ employee.rb: https://gist.github.com/leemcalilly/46150bee3e6216fa29d1
控制器/ employees_controller.rb: https://gist.github.com/leemcalilly/04f3acdac0c9a678bca8
模型/ employment.rb: https://gist.github.com/leemcalilly/6adad966dd48cb9d1b39
分贝/ schema.rb: https://gist.github.com/leemcalilly/36be318c677bad75b211
答案 0 :(得分:52)
请记住,您为强参数(employees,employee_ids等)提供的名称在很大程度上是不相关的,因为它取决于您选择提交的名称。根据命名约定,强参数不起作用“神奇”。
https://gist.github.com/leemcalilly/a71981da605187d46d96在'employee_ids'上抛出“未经许可的参数”错误的原因是因为它期望每个https://github.com/rails/strong_parameters#nested-parameters的标量值数组,而不仅仅是标量值。
# If instead of:
... "employee_ids" => "1" ...
# You had:
... "employee_ids" => ["1"]
然后您的强参数将起作用,具体来说:
... { :employee_ids => [] } ...
因为它正在接收一个标量值数组,而不仅仅是一个标量值。
答案 1 :(得分:4)
好的,所以我实际上不需要嵌套参数。这就是最终为我工作的原因:
# 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
以下是有效的变化组合。
仍然不太明白为什么会这样。
答案 2 :(得分:0)
我可以发布我在其中一个控制器中使用的permit语句。这也有很多关联。嵌套permit数组。在permit语句中使用lookup关联。唯一的区别应该是你的第三次不会嵌套。
在我的情况下,协会
引用
has_many :quote_items
。
QuoteItems has_many :quote_options, :through => quote_item_quote_options
。
在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]])