Rails 4 collection_select来自另一个模型

时间:2014-12-16 21:10:41

标签: ruby-on-rails

我的模型有以下(相关)声明:

class Campaign < ActiveRecord::Base
  has_many :placements, dependent: :destroy
  has_many :clients, dependent: :destroy

  accepts_nested_attributes_for :clients, allow_destroy: true
  accepts_nested_attributes_for :placements, allow_destroy: true
end

class Placement < ActiveRecord::Base
  has_one :client, through: :campaign
  belongs_to :campaign
  validates_presence_of :hashtags_instagram, :hashtags_twitter, :sms, :url, :channel
end

class Client < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :placement

  validates_presence_of :client_name
end

如此有效,广告系列有很多展示位置和客户。展示位置只有一个客户端,并且只与一个广告系列相关联(或者至少应该是,我仍然不确定我是否正确地执行了此操作)。

因此,在我的展示位置表单中,我希望它显示属于展示位置广告系列(并非所有广告系列)的所有客户的下拉菜单。如果是新展示位置,则应显示&#34;请选择或类似&#34;否则,它应显示属于该展示位置的客户。

我似乎无法获得:prompt选项。它实际上从未显示Please Select,只是列表中的第一个客户端。我试图用它来使它工作:

奇怪的是,如果我将提示更改为include_blank,它实际上会显示空白项目(尽管它仍然会选择列表中的第一个客户端,而不是空白项目。)

当我尝试一些东西时,我尝试了代码:

 = f.collection_select(:placement_id, @placement.client.all.to_a, :id, :client_name, {:prompt => true}, class: "newdropdown-menu", id: "newdropdown")

收到错误消息:

Could not find the source association(s) :client or :client in model Campaign. Try 'has_many :client, :through => :campaign, :source => <name>'. Is it one of :user, :placements, :clients, or :photo?

如果我更改了集合,请选择阅读:

= f.collection_select(:campaign_id, @placement.campaign.clients.all.to_a, :id, :client_name, {:prompt => true}, class: "newdropdown-menu", id: "newdropdown")

然后它运行,但实际上并不显示提示,只显示列表。

将@placement更改为展示位置似乎没有任何影响(这似乎很奇怪)。

我不想将其更改为has_many,因为展示位置应该只有一个客户端。我该怎么办?我试过搞乱:来源,但它似乎与我的问题无关。

1 个答案:

答案 0 :(得分:0)

您需要将html选项放在哈希中:

f.collection_select(:campaign_id, @placement.campaign.clients.all, :id, :client_name, {:prompt => true}, {class: "newdropdown-menu", id: "newdropdown"})

此处提供的文档: http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select