【问题标题】:Rails 4 collection_select from another modelRails 4 collection_select 从另一个模型
【发布时间】:2014-12-16 21:10:41
【问题描述】:

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

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

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

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

我似乎无法让 :prompt 选项工作。它实际上从不显示请选择,只是列表中的第一个客户端。我试图用它来让它工作:

奇怪的是,如果我将提示更改为 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 更改为placement 似乎没有任何效果(这似乎很奇怪)。

我不想将其更改为 has_many,因为展示位置应该只有一个客户。我应该如何进行?我尝试弄乱 :source,但它似乎与我的问题无关。

【问题讨论】:

  • 首先,您的关联是clients,而不是client

标签: ruby-on-rails


【解决方案1】:

您需要将 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

【讨论】:

  • 我添加了以下行:= f.collection_select(:campaign_id, @placement.campaign.clients.all, :id, :client_name, {:prompt => true}, {class: "newdropdown- menu", id: "newdropdown"}) ,但行为完全相同,它只是显示客户端列表,没有“请选择”。
  • 哦,好吧,我误解了你想要实现的目标,因为你会使用 include_blank: 'Please Select',所以试试这个:f.collection_select(:campaign_id, @placement.campaign.clients。全部,:id,:client_name,{include_blank:'请选择'},{class:“newdropdown-menu”,id:“newdropdown”})
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2016-07-31
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多