通过未选中的复选框

时间:2018-02-20 22:17:06

标签: ruby-on-rails nested-attributes form-for fields-for accepts-nested-attributes

我在表单中创建复选框,表示用户订阅的通知方法,并允许用户订阅其他通知方法或取消订阅现有通知方法。这是关系的样子:

class User
  has_many :subscriptions, dependent: :destroy
  accepts_nested_attributes_for :subscriptions, allow_destroy: true
end

和...

class Subscription
  enum method: [:email, :txt]
  enum category: [:order_confirmation, :order_update]

  belongs_to :user

  validates :category, :method, presence: true
end

我正在使用的表单form_tag

如果用户取消选中任何复选框,我希望删除匹配的订阅。我不确定这里的最佳方法是使用_destroy属性还是阻止将该复选框的所有属性发送到服务器。

如果它是前者,我想我可以为_destroy创建隐藏字段,但我不知道如何有条件地将该隐藏字段设置为true,具体取决于是否选中了复选框。

如果它是后者,我无法弄清楚当取消选中复选框时如何不发送隐藏字段。我需要为订阅hidden_field添加id,以便Rails不会创建新订阅(如果已存在),以及hidden_field订阅&{} #39; s category因此可以创建正确的订阅类型。

这是我创建的复选框的样子。现在,我只是为order_update通知类型创建复选框:

<% [{ label: "Email", value: "email" }, { label: "Text message", value: "txt" }].each_with_index do |options, index| %>
  <% existing_subscription = current_user.subscriptions.order_update.where(method: options[:value]) %>
  <%= fields_for "user[subscriptions_attributes][]", existing_subscription.first_or_initialize, index: index do |t| %>
    <%= t.hidden_field :category, value: :order_update %>
    <%= t.check_box :method, { checked: existing_subscription.any?, include_hidden: false }, options[:value] %>
    <%= t.label :method, options[:label] %>
    <%= t.hidden_field :id %>
  <% end %>
<% end %>

如果我当前订阅了电子邮件和文字通知,然后我取消选中文本框,这就是我的参数:

"subscriptions_attributes"=>{"0"=>{"category"=>"order_update", "id"=>"1"}, "1"=>{"category"=>"order_update", "method"=>"email", "id"=>"2"}}

0 个答案:

没有答案