Rails 4:strong_params,nested_attributes_for和belongs_to association trouble

时间:2014-12-05 19:14:05

标签: ruby-on-rails-4 associations nested-attributes strong-parameters

我真的无法理解Rails 4强大的参数,belongs_to association和form with fields_for。

想象一下,我有引用某些价格的模型:

class Quote < ActiveRecord::Base
  belongs_to :fee
  accepts_nested_attributes_for :fee

现在,我已经在db中添加了一些费用,并使用fields_for在我的form_for @quote上添加了一些radiobuttons。 radiobuttons的值只是记录的ID。

这是令人不安的部分,控制器:

def create
  @quote = Quote.new(quote_params)
  ...

end

def quote_params
  params.require(:quote).permit(:amount_from, fee_attributes: [:id])
end

根据我的理解,自动Rails应该使用一些id来获取费用记录,但是有一些神秘的错误。

params hash是:"quote"=>{"amount_from"=>"1200", "fee_attributes"=>{"id"=>"1"}}

记录尾巴:

Completed 404 Not Found in 264ms

ActiveRecord::RecordNotFound (Couldn't find Fee with ID=1 for Quote with ID=)
  app/controllers/quotes_controller.rb:14:in `create'

我真的不明白这里发生了什么,读过Rails协会指南,用谷歌搜索所有信息,但无济于事。

我想在这里实现的是理解正确的“Rails方式”,使用我在表单中添加的一些参数来获取新Quote对象的一些关联。

1 个答案:

答案 0 :(得分:0)

猜猜我得了nested_attributes_for错误,不知何故以为它会自动调用Fee.find。 我已选择从表单中删除fields_for帮助程序并手动渲染字段,如

radio_button_tag 'fee[id]', fee.id

然后在控制器中我现在有2种方法:

  def quote_params
    params.require(:quote).permit(:amount_from)
  end

  def fee_params
    params.require(:fee).permit(:id)
  end

我的行动看起来像

 def create
    @quote = Quote.new(quote_params)
    @quote.fee = Fee.find(fee_params[:id])
    ...

如果必须使用不那么直接的init逻辑来处理许多不同的对象,那么对最佳实践的任何补充都是受欢迎的。