创建多个has_many:通过form_for记录

时间:2014-10-24 23:08:32

标签: ruby-on-rails ruby ruby-on-rails-4 has-many-through form-for

我有一个订阅模式,订阅可以通过订阅选择许多eliquids。我的三个模特:

subscription.rb

class Subscription < ActiveRecord::Base
    has_many :subscription_choices
    has_many :eliquids, through: :subscription_choices
    has_one :address
    belongs_to :subscription_plan

    accepts_nested_attributes_for :address, allow_destroy: true
    accepts_nested_attributes_for :subscription_choices, allow_destroy: true
end

subscription_choice.rb

class SubscriptionChoice < ActiveRecord::Base
    belongs_to :subscription
    belongs_to :eliquid
    accepts_nested_attributes_for :eliquid
end

eliquid.rb

class Eliquid < ActiveRecord::Base
    has_many :subscription_choices
end

我希望能够从一个表单提交中构建多个subscription_choices。我正在努力从我的form_for获取多个subscription_choices到params。表格如下:

new.html.erb

<%= form_for @subscription, html: {role: "form", id: "signUp"} do |subscription_form| %>
     <% for i in 1..3 %>
         <%= subscription_form.select(:subscription_choices, options_from_collection_for_select(@eliquids, 'id', 'name')) %>
     <% end %>
<% end %>

我正在尝试创建3种eliquid选项。当表单被提交时,每个订阅选项都会被覆盖,所以我最终只选择最终选项,params看起来像这样:

Parameters: {"subscription" => { "subscriptions_choices" => "3" }}

我想要实现的是这个(或类似的东西):

Parameters: {"subscription" => { "subscription_choices" => [1, 2, 5] }}

我可以这样做:

<%= form_for @subscription, html: {role: "form", id: "signUp"} do |subscription_form| %>
     <% for i in 1..3 %>
         <%= select_tag("subscription_choice_#{i}", options_from_collection_for_select(@eliquids, 'id', 'name')) %>
     <% end %>
<% end %>

这会给我一些这样的参数:

Parameters: { "subscription_choice_1" => "1", "subscription_choice_2" => "3", "subscription_choice_3" => "5" }

我可以在我的控制器中迭代这些参数并保存选择,但我的直觉告诉我必须有更好的轨道方式。这似乎不是一个真正的利基用例,我想我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:0)

添加选项:

multiple: true

select_tag帮助者。标签最后应在名称后面加上括号,以便它们作为数组值提交。 E.g。

<select name="subscription[subscription_choices][]">

Rails docs解释了标签助手的各种选项。您也可以查看fields_for

答案 1 :(得分:0)

为了通过表单管理关联,我建议使用simple form。用简单的形式,这就变成了:

<%= f.input :eliquid_ids, collection: @eliquids %>

如果您不喜欢简单表单,可以为eliquid_ids属性创建select标记。

<%= select_tag("subscription[eliquid_ids][]", options_from_collection_for_select(@eliquids, 'id', 'name')) %>

分配eliquid_ids将自动创建SubscriptionChoice联接模型记录。