我在轨道上4.我有三个模型,Blends,Addons和AddonPairings。用户创建混合和
Blend
have_many :addon_pairings
have_many :addons, through: :addon_pairings
Addon
have_many :addon_pairings
have_many :blends, through: :addon_pairings
AddonPairing
belong_to :blend
belong_to :addon
我的插件都在数据库中预先制作,供用户选择他们想要添加到混音的数量。
在new.html.erb
我的混合
<%= form_for [current_user, @blend] do |f| %>
<div class="form-group">
<%= f.label :addons, "Add some addons to your blend" %>
<%= f.collection_check_boxes :addon_ids, Addon.all, :id, :name %>
</div>
<div class="form-group">
<%= f.submit class: "btn btn-lg btn-primary" %>
</div>
<% end %>
我的混合控制器
def create
@user = User.find(params[:user_id])
@blend = @user.blends.build(blend_params)
if @blend.save
redirect_to @user, notice: "Your blend has been created."
else
flash.now[:notice] = "Something went wrong. Please check the errors below."
render 'new'
end
end
private
def blend_params
params.require(:blend).permit(:name, :addon_ids)
end
如何让我的控制器在我的addon_pairings
表中创建将混合连接到所选插件的记录?感谢。
答案 0 :(得分:1)
你已经很好地实现了它。
您需要使用&#39; accepts_nested_parameters&#39;这样做。
这样,您就可以使用fields_for标签以“#”形式创建表单。实际上,在另一个模型中创建了这个字段,使得该条目由触发控制器并生成主窗体的当前对象所拥有。因此,由于您的collection_check_box创建了当前所拥有的对象,但在另一个模型中,它需要位于一个块内(仅作为示例):
<%= fields_for @owner.belonged_name %>
<%= collection_check_box %>
<% end %>
我建议你使用railscasts.com/episodes/196-nested-model-form-part-1和这个链接(http://www.createdbypete.com/articles/working-with-nested-forms-and-a-many-to-many-association-in-rails-4/)来理解嵌套参数的哲学。
请注意,由于不推荐使用attr_params,因此您必须允许控制器上的属性。
希望它有所帮助。
答案 1 :(得分:0)
只需更改
params.require(:blend).permit(:name, :addon_ids)
到
params.require(:blend).permit(:name, addon_ids: [])