2012-10-17 13 views
1

在rails上學習ruby,玩弄路由和路徑方法。 我已經用模型「Book」和「Author」構建了一個相當簡單的應用程序。每個作者可以有許多書籍,每本書都屬於作者等。紅寶石path_to只在明確的時候才起作用

我有一個作者控制器,其中列出了所有作者的#list方法。當它這樣做時,它也會迴應出所有的書。現在,我希望每本書都能指向使用我發現的這種漂亮路徑方法的書籍。

這裏是我的代碼片段:

<% @authors.each do |author| %> 
    <li><%= author.name %></li> 
    <ul> 
     <% author.books.all.each do |book| %> 
      <li><%= link_to book.name, controller: :books, action: :show, id: book.id %></li> 
     <% end %> 
    </ul> 
<% end %> 

有了這個link_to book.name, controller: :books, action: :show, id: book.id它工作正常,但東西告訴我,同樣可以實現更加容易。如果我使用books_show_path(book)它不會工作。

我的路線如下所示:

根: '作者#列表'

match 'authors/list' => 'authors#list' 
match 'books/list' => 'books#list' 
match 'authors/:id/delete' => 'authors#delete' 
match 'authors/:id/show' => 'authors#show' 
match 'books/:id/show' => 'books#show' 

什麼我錯在這裏做什麼?我需要做些什麼來使books_show_path(book)工作?

回答

3

退房Resource Routing的Rails指南的部分。

總之,慣例是您在路線定義resources :books,將路由/圖書索引操作和/書籍/ 123,顯示行動等,您也將有一些輔助的方法來生成路徑:

book_path(book) #=> /books/123 
books_path #=> /books 

其實的link_to和一堆其他的方法可以從對象生成路徑本身:

link_to book.name, book # will also call book_path(book) under the hood 
2

as選項是路由名稱

match 'books/:id/show' => 'books#show', as: :books_show 

但我強烈建議你閱讀有關resource routing

+0

真棒,謝謝!還有一個問題:我怎麼沒有在路線中說'match'books/list'=>'books#list'',以便它接受books_list_path? – weltschmerz

+0

我編輯了我的答案,請閱讀導軌路由文檔 –

+0

確定很酷,謝謝 – weltschmerz