Rails JQUERY Toggle с вложенными ресурсами

Я пытаюсь понять, как переключить действие «завершить» с вложенными ресурсами в рельсах. По какой-то причине я не могу заставить его делать то, что я хочу. Я продолжаю получать сообщение «Не удалось найти список без идентификатора». Что имеет смысл, но я не могу настроить его так, чтобы он работал. Было любопытно, знает ли кто-нибудь, как настроить вещи, чтобы заставить это работать правильно. Я предполагаю, что это, вероятно, как-то связано с моим файлом маршрутов или, может быть, с каждым блоком ?? в частичном. Спасибо.

Код ниже.

Контроллер книг

def finish
  @list = List.find(params[:list_id])
  @book = @list.books.find(params[:id])
  @book.update(finished: true)
    respond_to do |format|
        format.html {redirect_to list_path(@list)}
        format.js {}
    render @list
end
end

def unfinish
  @list = List.find(params[:list_id])
  @book = @list.books.find(params[:id])
  @book.update(finished: false)
    respond_to do |format|
        format.html {redirect_to list_path(@list)}
        format.js {}
    render @list
 end
end

Книги частично

 <table class="table table-hover">
<thead>
  <tr>
    <th>Title</th>
    <th>Author</th>
    <th>Pages</th>
    <th>Did you finish the book?</th>
    <th>Remove book from list</th>
  </tr>
</thead>
  <tbody>
    <% @books.each do |book| %>
      <tr>
        <td><%=book.name %></td>
        <td><%=book.author %></td>
        <td><%=book.pages %></td>
        <% if book.finished? %>
        <td class="unfinish-book"><%=link_to 'Finished',      unfinish_book_path(book), :method => :put, remote: true %></td>
    <% else %>
    <td class="finish-book"><%=link_to 'Mark as Finished', finish_book_path(book), :method => :put, remote: true %></td>
    <% end %>
    <td class><%= link_to '|Remove Book|', list_book_path(@list, book), method: :delete, data: { confirm: 'Are you sure?'} %></td>
<% end %>
  </tr>
  </tbody>
  </table>

Маршруты

 Rails.application.routes.draw do
   root 'lists#index'

   resources :lists do
     resources :books
   end

  resources :books do
    member do
      put :finish
      put :unfinish
    end
  end
 end

person Mark Hustad    schedule 28.12.2015    source источник
comment
Для чего бы это ни стоило, вам не нужно создавать для этого специальный метод. Просто передайте свои атрибуты в ссылке put/patch обычному методу update вашего контроллера, и он заработает.   -  person Wes Foster    schedule 29.12.2015
comment
Спасибо за совет. Я вернулся к этому приложению после некоторого отсутствия. Не могу честно вспомнить, почему я сделал это так, как сделал.   -  person Mark Hustad    schedule 29.12.2015


Ответы (1)


Если вы посмотрите на свой вывод rake routes, вы увидите следующие маршруты завершения/незавершения:

  finish_book PUT    /books/:id/finish(.:format)   books#finish
unfinish_book PUT    /books/:id/unfinish(.:format) books#unfinish

Как видите, в этих URL-адресах нет параметра :list_id, только параметр :id, поэтому params[:list_id] в коде вашего контроллера не будет иметь значения, отсюда и ошибка, которую вы получаете.

Вероятно, вы должны иметь эти маршруты завершения/незавершения внутри вложенного ресурса books, например:

resources :lists do
  resources :books do
    member do
      put :finish
      put :unfinish
    end
  end
end

Затем настройте вызовы link_to на send: finish_list_book_path(@list, book) и незаконченный эквивалент.

person smathy    schedule 28.12.2015
comment
Хороший совет. Я думал, что уже пробовал это, и, посмотрев на ваш пример, я понял, что забыл «делать» после «ресурсы: книги». Черт, всегда самые маленькие вещи. Цените помощь. - person Mark Hustad; 29.12.2015