如何从Rails 3中的复选框更新多个记录的属性?

时间:2011-06-11 17:37:35

标签: ruby-on-rails-3 actioncontroller

我有一个属性可以将页面添加到我的网站导航(它是一个布尔值),我希望能够一次性打开和关闭复选框中的页面。我试过跟随这个railscast: http://railscasts.com/episodes/52-update-through-checkboxes但我遇到了两个问题。

一个 - 我希望复选框显示“navbar”选项的当前状态。

和两个 - 我不知道如何更新导航栏字段。

这是我的控制器:

  def nav
    Section.update_all([:navbar => :params[:navbar]], :id =>params[:section_ids])
    flash[:success] = "Sections were added to navbar"
    redirect_to(admin_sections_path)
  end

和我的观点:

<%= form_tag nav_admin_sections_path, :method => :put do %>
  <ol id="section_list" class="records_list">
  <% @sections.each do |section| %>
    <li id="section_<%= section.id %>">
    <table>
      <tr class="handle">
        <td class="title link_icon directory_link"><%= section.name %></td>
        <td class="option"><%= check_box_tag "section_ids[]", section.id %></td>
        <td class="action"><%= link_to 'Edit', edit_admin_section_path(section), :class=>"link_icon edit_link"   %></td>
        <td class="action">
          <% if section.has_bio == false %>
          <%= link_to 'Destroy', admin_section_path(section), :confirm => 'Are you sure?', :method => :delete, :class=>"link_icon delete_link"   %>
          <% end %>
        </td>
      </tr>
      </table>

    </li>
  <% end %>
  </ol>

  <ol>
    <li class="submit">
      <%= submit_tag %>
    </li>
  </ol>
<% end %>

该表嵌套在列表项中,因为我正在做一些jquery-ui可排序的东西。

无论如何,我需要该复选框来显示当前状态:navbar我需要能够更新它们。现在,如果我尝试更新它们,我会收到此错误:

    can't convert Symbol into Integer
app/controllers/admin/sections_controller.rb:95:in `[]'
app/controllers/admin/sections_controller.rb:95:in `nav'

在我控制器的这一行“

Section.update_all([:navbar => :params[:navbar]], :id =>params[:section_ids])

所以我想我没有正确地将check_box状态传递给我的控制器。

1 个答案:

答案 0 :(得分:1)

  1. 正确检查复选框。只需添加布尔值作为第三个参数。

    <td class="option"><%= check_box_tag "section_ids[]", section.id, section.navbar %></td>
    
  2. 更新导航栏字段您必须同时设置导航栏开启和关闭的部分。

    ids = [*params[:section_ids]] + [0] # makes sure it works when no navbars are selected
    Section.update_all({:navbar => true}, {:id => ids})
    Section.update_all({:navbar => false}, "sections.id NOT IN (#{ ids.join(',') })")
    
  3. 修改

    在第二次update_all中需要双引号而不是单引号。更新了上面的代码。

    编辑2

    将逗号括在引号中的join