【问题标题】:Works for 'edit', fails for 'new'... undefined method `association' for #<ActionView::Helpers::FormBuilder:适用于“编辑”,“新”失败...未定义的方法“关联”#<ActionView::Helpers::FormBuilder:
【发布时间】:2014-03-08 11:30:10
【问题描述】:

在嵌套表单上遵循 railscast #196... 我有以下模型:

class DealContact < ActiveRecord::Base
  belongs_to :deal
  belongs_to :contact

class Contact < ActiveRecord::Base
  has_many :deal_contacts
  has_many :deals, through: :deal_contacts
  accepts_nested_attributes_for :deal_contacts, :allow_destroy => true

class Deal < ActiveRecord::Base
  has_many :deal_contacts
  has_many :contacts, through: :deal_contacts
  accepts_nested_attributes_for :deal_contacts, :allow_destroy => true

在我的交易表格中我有这个

<div class="row">
    <div class="span12"><h4>Contacts Associated with this Deal</h4></div>
    <%= f.fields_for :deal_contacts do |builder| %>
        <%= render 'deal_contact_fields', f: builder %>
    <% end %>
    <div class="span1"><%= link_to_add_contact "Add", f, :deal_contacts %></div>
    </div>
</div>

而 deal_contact_fields 只包含:

<fieldset>
    <div class="span4">
        <%= f.association :contact, collection: Contact.all(order: 'contact_name'), label_method: :full_desc %>
    </div>
    <div class="span6">
        <%= f.label :details, "Details " %>
        <%= f.text_field :details %>
    </div>
    <div class="span1" style="margin-top: 30px">
        <%= f.hidden_field :_destroy %>
        <%= link_to "remove", '#', class: "remove_fields" %>
    </div>
</fieldset>

这一切都非常适合编辑现有交易,但是当我创建一个新交易时,我收到以下错误:

undefined method `association' for #<ActionView::Helpers::FormBuilder:0x007fe6fba55840>

:-(

【问题讨论】:

    标签: ruby-on-rails forms activerecord


    【解决方案1】:

    .association 仅适用于simple_form gem

    您必须使用 collection_select 才能在没有该 gem 的情况下实现您想要的:

    <%= f.collection_select :contact, Contact.all(order: 'contact_name'), :id, :name %>
    

    【讨论】:

    • 您好 Rich,感谢您的回复。安装了简单的表单,当我编辑现有交易时它工作正常,可以将联系人添加到我的心中内容。不过,我会尝试切换到 collection_select。
    • 抱歉,没有意识到您安装了simple_form - 也许您传递builder 对象(而不是f)是导致问题的原因?
    • 您目前正在将f: builder 传递给您的部分。这是f.fields_for 构建器,而不是整个表单构建器对象。也许f.association 将用于父f 对象,而不是builder 对象
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2011-01-29
    • 2011-11-08
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多