我有一个嵌套属性的模型。我无法让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_id
,Contact
有person_id
,Person
有一个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
。
答案 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