Ruby path_to仅在显式时有效

时间:2012-10-17 12:02:01

标签: ruby-on-rails ruby path link-to

在轨道上学习红宝石,玩弄路线和路径方法。 我用模型“Book”和“Author”构建了一个相当简单的应用程序。每个作者可以有很多书,每本书都属于作者等。

我有一个作者控制器,其中列出了所有作者的方法#list。当它这样做时,它也回应了他们所有的书。现在我希望每本书都能用我发现的这种漂亮的路径方法指出书#shour。

这是我的代码:

<% @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)则无效。

我的路线如下所示:

root to:'authors#list'

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)工作?

2 个答案:

答案 0 :(得分:3)

查看Rails指南的Resource Routing部分。

简而言之,惯例是您在路由中定义resources :books,将路由/书籍定义为索引操作和/ 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

答案 1 :(得分:2)

as选项用于路由名称

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

但我强烈建议您阅读resource routing