3

我在 Rails 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表中创建将混合连接到所选插件的记录?谢谢。

4

2 回答 2

1

你在某种程度上实施得很糟糕。

您需要使用“accepts_nested_pa​​rameters”来执行此操作。

这样,您将使用 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 已弃用,因此您也必须允许控制器上的属性。

希望能帮助到你。

于 2014-04-29T17:54:17.673 回答
0

在你的 blend_params 方法中改变

params.require(:blend).permit(:name, :addon_ids)

params.require(:blend).permit(:name, addon_ids: [])
于 2016-08-18T07:31:44.823 回答