多选择下拉公司,并保存额外和相应的公司

时间:2015-04-20 12:09:50

标签: ruby-on-rails ruby

这是我的代码:

multiple select时,Perk不会保存在multiple true/false上。 perk save and habtm working。

class Perk < ActiveRecord::Base
 has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
 has_and_belongs_to_many :perks
end

查看 perk / new.html.erb

<%= select_tag "company_id", options_from_collection_for_select(Company.all, 'id', 'name',@perk.companies.map{ |j| j.id }), :multiple => true %>
<%= f.text_field :name  %>

控制人员代码:

def new
  @perk = Perk.new
  respond_with(@perk)
end

def create
  @perk = Perk.new(perk_params)
  @companies = Company.where(:id => params[:company_id])
  @perk << @companies 
  respond_with(@perk)
end

2 个答案:

答案 0 :(得分:0)

听起来您可能没有在控制器的perk_params方法中包含company_id。 Rails四使用强烈的pramas,这意味着你需要说明你允许设置的params。但是如果没有看到更多的代码就很难肯定地说。

在您的控制器中,您应该看到这样的方法(可能有更多选项:name):

def perk_params
  params.require(:perk).permit(:name)
end

您应该尝试添加:company_id,使其看起来像这样:

def perk_params
  params.require(:perk).permit(:name, :company_id)
end

如果您的方法中有其他参数,请将它们留下并添加:company_id

编辑到原始答案

上述内容仅适用于一对多或一对一,因为您使用的是has_and_belongs_to_many,您需要添加公司:[]到您的参数列表的末尾,如下所示

def perk_params
  params.require(:perk).permit(:name, companies: [] )
end

或者像这样

def perk_params
  params.require(:perk).permit(:name, companies_ids: [] )
end

有关详细信息,请参阅以下链接:

http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters

答案 1 :(得分:0)

您的select_tag应该返回一组company_ids:

<%= select_tag "company_ids[]", options_from_collection_for_select(Company.all, 'id', 'name',@perk.companies.map{ |j| j.id }), :multiple => true %>

http://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag#691-sending-an-array-of-multiple-options

然后,在您的控制器中,引用company_ids参数:

@companies = Company.where(:id => params[:company_ids])

(我假设您在创建操作中故意遗漏了@perk.save调用...否则,也应包含该调用。Model.new不会存储记录。)< / p>