Как обновить атрибуты нескольких записей из флажков в Rails 3?

#ruby-on-rails-3 #actioncontroller

#ruby-on-rails-3 #actioncontroller

Вопрос:

У меня есть атрибут для добавления страницы в навигацию моего сайта (его логическое значение), и я хочу иметь возможность включать и выключать страницы из флажков одновременно. Я попытался следовать этому railscast:http://railscasts.com/episodes/52-update-through-checkboxes но я столкнулся с двумя проблемами.

Первый — я хочу, чтобы флажки отображали текущее состояние опции «панель навигации».

и второе — я не уверен, как обновить поле навигационной панели.

Вот мой контроллер:

   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:

  1. Установите флажок правильно. Просто добавьте логическое значение в качестве третьего аргумента.

     <td class="option"><%= check_box_tag "section_ids[]", section.id, section.navbar %></td>
      
  2. обновите поле navbar Вам нужно будет установить оба раздела, в которых navbar включен и выключен.

     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(',') })")
      

Редактировать

Во втором update_all требуются двойные кавычки вместо одинарных. Обновлен приведенный выше код.

ПРАВКА 2

Заключаем запятую внутри join в кавычки

Комментарии:

1. Я получаю ошибку mysql при этом втором update_all: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1: UPDATE sections` SET navbar = 0, ГДЕ (sections.id НЕ В (#{ ids.join(,) }))`

2. Во втором update_all требуются двойные кавычки вместо одинарных. Обновлен приведенный выше код.

3. на самом деле я получаю синтаксическую ошибку в этой запятой в { ids.join(,) }) , в которой говорится, что запятая была неожиданной, она ожидала закрывающий prin. очевидно, что удаление запятой тоже не работает, лол

4. @rugbert -> sry. мой разум, должно быть, был зашифрован. Просто поместите запятую в кавычки.