如何在Rails中使用嵌套属性编写collection_select

时间:2017-01-29 10:51:53

标签: ruby-on-rails

我有一个嵌套属性的模型。我无法让collection_select工作。这就是我所拥有的

class Client < ActiveRecord::Base
  belongs_to :contact
  belongs_to :person, dependent: :destroy
  accepts_nested_attributes_for :person, allow_destroy: true
end

class Contact < ActiveRecord::Base
  has_many :clients
  belongs_to :person, dependent: :destroy
  accepts_nested_attributes_for :person, allow_destroy: true
end

class Person < ActiveRecord::Base
  has_one :client
  has_one :contact
  belongs_to :personal_title
  # Returns the combined personal title, first and surname
  def name
    [
      personal_title.nil? ? '' : personal_title.title,
      first_name || '',
      last_name || ''
    ].reject(&:empty?).join(' ')
  end
end

总之,Client有一个contact_id和一个person_idContactperson_idPerson有一个personal_title_id }。在我的表格上我有

<div class="field">
  <%= f.label :contact_id %><br>
  <%= f.collection_select(:contact_id, Client.all, :id, :name,
    {include_blank: true}) %>
</div>

我知道问题出在哪里,但从文档中我无法解决如何解决问题。我得到的错误是undefined method 'name' for #<Client:0x6c01350>。那是对的。 name()在Person中声明,而不是Client。我可以使用它,

<select name="client[contact_id]">
  <% Contact.all.each do |contact| %>
    <option value="<%= contact.id %>"><%= contact.person.name %></option>
  <% end %>
</select>

这是有效的,因为我使用的是contact.person.name,而不是contact.name

1 个答案:

答案 0 :(得分:1)

在模型中,Client不是返回名称的方法。 返回名称的方法在Person类中。

在客户端中创建一个方法以返回该人的姓名,它应该可以正常工作。

class Client < ActiveRecord::Base
  belongs_to :contact
  belongs_to :person, dependent: :destroy
  accepts_nested_attributes_for :person, allow_destroy: true

  def name
    self.person.name
  end

end