我设置了一个MTI,其客户端继承自Person。我还有一个与客户模型一对一的项目。在我的视图project / new.html.erb中,我想创建一个下拉菜单,其中包含可供选择的客户名称。
<%= f.collection_select(:client_id, Client.all, :id, :XXX, {include_blank: true, :data => {:placeholder => "Select a client"}}, {:class => "chosen-select", :tabindex => "-1", :style => "width:350px;", }) %>
XXX通常是表示直接模型属性的符号(在本例中为客户端) 如何显示name属性,该属性实际上是Person类的属性?
更新 我在我的客户端类
中添加了一个person_name方法class Client < ActiveRecord::Base
has_many :projects
has_one :person, as: :profile, dependent: :destroy
attr_accessible :person_attributes, :pref_hours_of_contact, :pref_method_of_contact
accepts_nested_attributes_for :person
def person_name
person.name
end
end
我还修改了观点:
<%= f.collection_select(:client_id, Client.all, :id, :person_name, {include_blank: true, :data => {:placeholder => "Select client"}}, {:class => "chosen-select", :tabindex => "-1", :style => "width:350px;", }) %>
答案 0 :(得分:1)
我还没试过,但我相信你可以在Client类中有一个输出Person属性的方法。我假设你想要一个人名:
请注意collection_select
def person_name
# Access your super attribute
end
中所说的内容:
:value_method和:text_method参数是要调用的方法 在每个集合成员
因此,如果您可以将方法发送到将检索Person属性的Client对象,那么您就可以了。这实际上取决于您如何定义MTI,但在一天结束时,您始终可以在您的Client类中使用它:
<%= f.collection_select(:client_id, Client.all, :id, :person_name, {include_blank: true, :data => {:placeholder => "Select a client"}}, {:class => "chosen-select", :tabindex => "-1", :style => "width:350px;", }) %>
所以你可以这样做:
collection_select
如果您要使用documentation gem,可以直接在客户端<%= f.collection_select(:client_id, Client.all, :id, :name, {include_blank: true, :data => {:placeholder => "Select a client"}}, {:class => "chosen-select", :tabindex => "-1", :style => "width:350px;", }) %>
中使用Person对象。
{{1}}