我在表单中创建复选框,表示用户订阅的通知方法,并允许用户订阅其他通知方法或取消订阅现有通知方法。这是关系的样子:
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"}}