2015-12-28 4 views
1

Я пытаюсь выяснить, как переключить действие «закончить» с помощью вложенных ресурсов в рельсы. По какой-то причине я не могу заставить его делать то, что я хочу. Я продолжаю получать «Не могу найти список без идентификатора». Это имеет смысл, но я не могу настроить его так, чтобы он работал. Любопытно, если кто-нибудь знает, как настроить вещи, чтобы заставить это функционировать должным образом. Я предполагаю, что это, вероятно, имеет какое-то отношение к моему файлу маршрутов или к каждому блоку, может быть? в частичном. Благодарю.Rails JQUERY Toggle with Nested Resources

Код ниже.

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

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 
+1

Для чего вам не нужно создавать специальный метод для этого. Просто передайте свои атрибуты в ссылку 'put/patch' на обычный' update' ваш контроллер, и он будет работать. –

+0

Спасибо за совет. Я вернулся в это приложение после того, как уехал некоторое время. Не могу честно вспомнить, почему я сделал это так, как сделал. –

ответ

1

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

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

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

Вы должны, вероятно, те отделка/unfinish маршрутов внутри вложенный books ресурса, например, так:

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

Затем настроить link_to вызовов для отправки: finish_list_book_path(@list, book) и unfinish эквивалента.

+1

Хороший совет. Я думал, что уже пробовал это, и, посмотрев на ваш пример, я понял, что забыл «сделать» после «ресурсов: книги». Данг, всегда самые маленькие вещи. Цените помощь. –

+0

Добро пожаловать. – smathy

 Смежные вопросы

  • Нет связанных вопросов^_^