在Rails中使用collection_select时如何显示相关模型的属性

时间:2014-08-02 16:13:33

标签: ruby-on-rails ruby

我设置了一个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;", }) %>

1 个答案:

答案 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}}