Rails:使用 fields_for 和 check_box

Posted

技术标签:

【中文标题】Rails:使用 fields_for 和 check_box【英文标题】:Rails: using fields_for with check_box 【发布时间】:2014-03-11 21:34:22 【问题描述】:

我有一个显示即将发生的事件的网站。 Event 有一个名为 :approved 的布尔属性。我想显示管理员的所有事件列表和:approved 字段的复选框。如果批准,则应检查它们,否则应取消检查。我猜我需要使用fields_for?当管理员检查表单中的:approved 字段时,我希望它在参数内传输为“1”或“true”或“已检查”,而当他取消选中该字段并提交表单时则相反。我还需要参数列表中每个字段的名称类似于events[event.id],但我出现的是events[event.id][approved],并且我的所有复选框都没有被选中。到目前为止,这是我所拥有的:

admin_index.html.erb

<%= form_tag '/admin_events', method: :get do %>
  <table id="admin_events_table" class="table-striped" style="width: 100%">
    <thead>
      <th>Date</th>
      <th>Time</th>
      <th>Title</th>
      <th>Venue</th>
      <th>Visibility</th>
      <th></th>
      <th></th>
    </thead>
    <tbody id="admin_events">
      <%= render @events %>
    </tbody>
  </table>
  <%= submit_tag "Approve", class: "btn btn-default" %>
<% end %>

_event.html.erb

<tr>
  <td><%= fields_for "events[#event.id]" do |form| %>
        <%= form.check_box :approved %>
      <% end %>
  </td>

<td><%= event.date.strftime('%A %B %-d') %></td>
<td><%= event.time.strftime('%l:%M %P') %></td>
<td><%= event.title %></td>
<td><%= Venue.find(event.venue_id).name %></td>
<td><%= link_to "Edit", edit_event_path(event) %></td>
<td><%= link_to "Delete", event, method: :delete, data:  confirm: "Are you sure?"  %></td>

更新 这是我在控制器中想出的,以便应用程序将:approved 更新为真或假。不过好像太复杂了:

events_controller.rb

if params[:commit]
  ids = params[:events].keys
  values = params[:events].values
  ids.each_with_index do |id, i|
    event = Event.find(id)
    if values[i].values[0] == "0"
      event.update(approved: false)
    else
      event.update(approved: true)
    end
  end
  redirect_to admin_events_path
end

【问题讨论】:

【参考方案1】:

如果您的视图如下所示:

<%= fields_for "events[]", event do |form| %>
  <%= form.check_box :approved %>
<% end %>

那么你的参数应该包含一个看起来像这样的哈希(假设 id 为 29 的事件被选中,id 为 23 的事件未被选中):

"events" => "29" => "approved" => "1", "23" => "approved" => "0"

你的控制器可以像这样保存它们:

events = params[:events]
events.each do |id, attrs|
  event = Event.find(id)
  event.update_attributes(attrs)
end

redirect_to admin_events_path

【讨论】:

so "approved" => "1" 用 update_attributes 转换为 true? 是的,有一些 ActiveRecord 魔法正在发生,因此您可以将“0”或“1”传递给布尔字段,它将分别将其转换为 false 或 true。 event.approved = "1" 工作方式相同

以上是关于Rails:使用 fields_for 和 check_box的主要内容,如果未能解决你的问题,请参考以下文章

Rails 使用 f.fields_for 和 AJAX 接受_nested_attributes_for

ruby 使用Rails中的fields_for编辑表单

Rails 设计 fields_for 不工作

Rails fields_for 表单未显示,嵌套表单

Rails 动态生成的 fields_for 不会被 form_tag 作为输入

嵌套表单 gem 和 jquery 的 Rails 问题