1

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

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为订阅添加一个,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"}}
4

0 回答 0