Rails: using fields_for with check_box



我有一个网站,显示即将发生的事件。Event有一个布尔属性叫做:approved。我想显示的所有事件的管理和复选框的:approved字段的列表。如果批准,应进行检查,否则不进行检查。我猜我需要使用fields_for ?当管理员在表单中检查:approved字段时,我希望它将内部参数传输为'1'或'true'或'checked',而相反,当他取消选中该字段并提交表单时。我还需要在参数列表中的每个字段的名称是类似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更新为true或false。但是看起来太复杂了:

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

如果你的视图是这样的:

<%= 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

相关内容

  • 没有找到相关文章

最新更新