我有一个订阅模式,订阅可以通过订阅选择许多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" }
我可以在我的控制器中迭代这些参数并保存选择,但我的直觉告诉我必须有更好的轨道方式。这似乎不是一个真正的利基用例,我想我错过了一些明显的东西。
答案 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
联接模型记录。