【问题标题】:nested attributes for has_one associationhas_one 关联的嵌套属性
【发布时间】:2014-01-08 11:32:26
【问题描述】:

我需要为在新建和编辑操作中有一个关联设置属性,所以我有这个:

产品型号

has_one :store
accepts_nested_attributes_for :store

表格

= form_tag @product do |f|
  = f.fields_for :store do |store_fields|
    = render 'store_form', :f => store_fields

在控制器中

params.require(:store).permit(:store).permit!

字段显示,但是当我提交表单时,它没有意义,商店关联为空。问题如何解决?

UPD

params.require(:product).permit(store_attributes: [:store_id, :supplier_id, :margin, :discount]).permit!

日志:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "product"=>{"name"=>"qwefqwefasdf", "description"=>"", "permalink"=>"asdf", "store_attributes"=>{"margin"=>"123", "discount"=>"123"}}, "button"=>"", "id"=>"asdf"}

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    确保发送您期望的参数。 (检查复数)

    你能从服务器端复制和粘贴参数的样子吗?

    13:44:29 INFO:   Parameters: {"utf8"=>"✓" .......
    

    这将有助于正确命名参数

    如果参数命名正确,但不被接受,则尝试明确指定它们

    params.permit(:product => [:something, :stores_attributes => [:name, :address ]])
    

    更新:

    params.permit(:product => [ :name, :description, :permalink, :store_attributes => [:store_id, :supplier_id, :margin, :discount]])
    

    嵌套属性示例:

    http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

    【讨论】:

    【解决方案2】:

    假设有问题的控制器是ProductsController,你的强参数定义不正确。

    试试:

    params.require(:product).permit(:store_attributes)
    

    或者,更严格地说,只允许必需的属性:

    params.require(:product).permit(store_attributes: [ :store_field1, :store_field2 ])
    

    其中:store_field1:store_field2store 模型中的属性,它们在您的form 中并且您希望允许。

    更新:

    以下内容应根据您的日志输出起作用。

    params.require(:product).permit(:name, :description, :permalink, store_attributes: [ :margin, :discount ])
    

    【讨论】:

    • 请看@UPD
    • @Zhirayr,你不需要额外的.permit!
    【解决方案3】:

    查看控制台中的参数。您应该会看到如下内容:

    { "product" => { "store_attributes" => {  } }
    

    这意味着您想要require :product(您想要产品参数)并允许商店的正确属性。

    params.require(:product).permit(:store_attributes => [ :name, :location, :etc ])
    

    当您 require(:store) 时,这意味着您希望参数哈希的根有一个“存储”键,但事实并非如此(以及为什么您的关联为空。)

    【讨论】:

    • 请看@UPD
    • 去掉最后一个permit!
    【解决方案4】:

    好的,正确答案是

    改变

      = f.fields_for :store do |store_fields|
    

      = f.fields_for :store, @vendor.store do |store_fields|
    

    【讨论】:

    • 不应该是:= f.fields_for :store_attributes, @vendor.store do |store_fields|
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2017-07-13
    相关资源
    最近更新 更多