2015-12-28 133 views
1

我想弄清楚如何在rails中嵌套資源切換「完成」操作。無論出於什麼原因,我都無法做到我想做的事。我不斷收到'找不到沒有ID的列表'。這是有道理的,但我不能配置它,所以它會工作。很好奇,如果有人知道如何配置的東西,以使其正常工作。我假設它可能與我的路線文件有關或每個塊可能?在部分。謝謝。Rails的JQUERY切換嵌套的資源

代碼如下。

書籍控制器

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參數,只有: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