【问题标题】:Rails 4: strong_params,nested_attributes_for and belongs_to association troubleRails 4:strong_params、nested_attributes_for 和 belongs_to 关联麻烦
【发布时间】:2014-12-05 19:14:05
【问题描述】:

我真的无法理解 Rails 4 的强参数、belongs_to 关联和带 fields_for 的表单。

假设我有报价的模型:

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

现在,我已经在数据库中植入了一些费用,并使用 fields_for 在我的 form_for @quote 上放置了一些单选按钮。单选按钮的值只是记录的 ID。

这里是麻烦的部分,控制器:

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

end

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

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

参数哈希为:"quote"=&gt;{"amount_from"=&gt;"1200", "fee_attributes"=&gt;{"id"=&gt;"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 对象的一些关联。

【问题讨论】:

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


    【解决方案1】:

    我猜我的 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])
        ...
    

    欢迎在必须处理大量不同对象且初始化逻辑不那么直接的最佳实践中添加任何内容。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多