【问题标题】:Rails forms - When no checkboxes are checked, param is not included in POSTRails 表单 - 如果未选中任何复选框,则参数不包含在 POST 中
【发布时间】:2023-04-07 14:39:01
【问题描述】:

我有一个任务模型,它与一个目标模型以多对多的关系加入。

我有一个任务编辑表单,用户可以通过复选框将任何目标与任务相关联。当一个复选框被选中时,它应该指示任务和特定目标之间的关联;当未选中复选框时,不应该有关联。这应该在表单提交时持久化到数据库中。

<%= form_for @task do |f| %>
  <% Objective.all.each do |objective| %>
    <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %>
  <% end %>
  <%= f.button :submit %>
<% end %>

更新任务似乎工作得非常好只要用户选中一个复选框,但是当用户没有选中任何复选框时,:objective_ids 参数(这是一个Objective ids) 根本不包含在 POST 操作中。因此,当我在控制器中执行 @task.update_attributes(params[:task]) 时,任务的目标集合不会更新(即任务不应再有任何与之关联的目标,因为没有选中任何复选框)。

那么我如何确保 :objective_ids 参数包含在 POST 中,即使只是作为一个空数组?

【问题讨论】:

    标签: ruby-on-rails forms rest activerecord post


    【解决方案1】:

    在所有具有空值的复选框上方添加隐藏字段。如果用户没有选中任何复选框,它将被发送。

    <%= form_for @task do |f| %>
      <%= hidden_field_tag "task[objective_ids][]", nil %>
      <% Objective.all.each do |objective| %>
        <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %>
      <% end %>
      <%= f.button :submit %>
    <% end %>
    

    这是一个很好的railscasts 关于这个。
    您可能还想检查source code

    【讨论】:

    • @Jignesh,在我的回答中;)
    • FWIW,答案中的 railscast 链接需要订阅才能查看信息,而 cmets 中的 asciicast 链接是免费可见的。
    • 这不是一个通用的解决方案,如果复选框列表中有一个值为 0,添加“nil”复选框将选中它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2014-07-11
    • 2016-06-22
    • 2016-08-22
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多