【问题标题】:Rails Nested attributes with check_box loop带有复选框循环的 Rails 嵌套属性
【发布时间】:2014-05-02 01:56:55
【问题描述】:

所以我有一个类别模型

class Category < ActiveRecord::Base
has_many :provider_categories
has_many :providers, :through => :provider_categories
end

和提供者模型

class Provider < ActiveRecord::Base
has_many :provider_categories
has_many :categories, :through => :provider_categories

accepts_nested_attributes_for :provider_categories, :allow_destroy => true
end

这是我的 provider_category 模型

class ProviderCategory < ActiveRecord::Base
belongs_to :provider
belongs_to :category
end

我正在尝试创建一个嵌套表单以将类别包含到提供程序表单中

= form_for @provider do |f|
  ...
  -@categories.each.with_index do |category,index|
    =f.fields_for :provider_category, category do |pl|
      =pl.check_box :category_id
      =pl.label category.name
      =pl.hidden_field :provider_id, value: @provider.id

当我加载我得到的页面时复选框不合作

undefined method `category_id' for #<Category:0x0000010184ff60>

编辑:

如果我将 :category_id 更改为 id 它可以工作,但 html 输出看起来像这样

<input name="provider[provider_category][id]" type="hidden" value="0"><input checked="checked" id="provider_provider_category_id" name="provider[provider_category][id]" type="checkbox" value="1">
<label for="provider_provider_category_Acupuncture">Acupuncture</label>
<input id="provider_provider_category_provider_id" name="provider[provider_category][provider_id]" type="hidden" value="1">

编辑 2:

我最终使用了 check_box_tag

-@categories.each.with_index do |category|
  =f.fields_for :provider_category, category do |pl|
    .li
      =check_box_tag "provider[provider_category][category_id]", category.id
      =pl.label category.name
      =pl.hidden_field :provider_id, value: @provider.id

现在 html 输出似乎是正确的,但它没有保存它。当我选择多个项目时,这是保存的哈希

"provider"=>{"name"=>"Mr. Awesome", "phone"=>"999-999-9999", "email"=>"awesome@awesome.com", "address"=>"awesome land", "provider_category"=>{"category_id"=>"3", "provider_id"=>"1"}}, "commit"=>"Save", "id"=>"1"}

我确实选择了 3 个选项,但只有最后一个被添加到哈希中

我还在提供者控制器的强参数中添加了提供者类别

params.require(:provider).permit(..., :provider_categories => [:category_id, :provider_id])

提前感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails ruby nested-attributes


    【解决方案1】:

    根据您的模型定义,ProviderCategory 具有属性category_idprovider_id。您收到以下错误:

    undefined method `category_id' for #<Category:0x0000010184ff60>
    

    因为您没有传递ProviderCategory 的实例,而是传递了Category 类的实例。通知category被传入

    =f.fields_for :provider_category, category do |pl|
    

    并且由于模型 Category 中没有名为 category_id 的属性,您会收到错误消息。

    要解决这个问题,只需在您的视图中更新fields_for 方法调用,如下所示:

    =f.fields_for :provider_categories, category.provider_categories.build do |pl|
    

    更新

    此外,您还必须更新 ProvidersController 的强参数,以便 provider_categories 的记录正确保存在数据库中:

    params.require(:provider).permit(..., :provider_categories_attributes => [:category_id, :provider_id])
    

    使用provider_categories_attributes 而不是provider_categories

    更新 2

    OP 还有另一个问题,因为未检查的category_id,值0 被传递,并且category_id 设置为0 的错误记录在provider_categories 中创建。

    建议通过在Provider 模型中将reject_if 选项传递给accepts_nested_attributes_for 方法调用来拒绝这些记录,如下所示:

    class Provider < ActiveRecord::Base
      has_many :provider_categories
      has_many :categories, :through => :provider_categories
      accepts_nested_attributes_for :provider_categories, :allow_destroy => true, reject_if: proc { |attributes| attributes['category_id'] == "0" }
    end  
    

    Checkbox 没有传递选中类别的 id,建议更新复选框代码如下:

    =pl.check_box :category_id, {}, category.id, 0
    

    【讨论】:

    • 我仍然遇到同样的错误,我最终使用 check_box_tag "provider[provider_category][category_id]", category.id
    • check_box_tag 是另一种选择。但是您当前的代码几乎没有按照建议进行修改应该可以工作。我想知道为什么你会得到同样的错误。如果您想知道并且想知道我们可以在聊天chat.stackoverflow.com/rooms/48530/ror 上进行调试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多