在Rails中查找嵌套资源中的路由

时间:2015-07-10 18:23:04

标签: ruby-on-rails ruby

我想知道如何访问rails中嵌套资源中的路由。我添加了类别,它打破了我的应用程序。

路线:

resources :categories do  
  resources :posts do
    resources :comments
  end
end 

它出错:

<% @posts.each_with_index do |post, index| %> 
  <%= link_to post do %>  # originally, this used to work but now it says 'undefined method "post_path"'
        <li class="post-title"><%= truncate post.title, length: 50 %></li>
        <li class="post-content"><%= truncate post.content, length: 400 %></li>
        <li><span class="post-comments"><%= post.comments.count %> comments</span></li>
<% end %>

我的根设置为帖子#index并有一个帖子列表。然而,路线嵌套(最初我没有类别)已经破坏了路线。

运行rake路线我得到了部分:

        category_posts GET    /categories/:category_id/posts(.:format)                            posts#index
                       POST   /categories/:category_id/posts(.:format)                            posts#create
     new_category_post GET    /categories/:category_id/posts/new(.:format)                        posts#new
    edit_category_post GET    /categories/:category_id/posts/:id/edit(.:format)                   posts#edit
         category_post GET    /categories/:category_id/posts/:id(.:format)                        posts#show
                       PATCH  /categories/:category_id/posts/:id(.:format)                        posts#update
                       PUT    /categories/:category_id/posts/:id(.:format)                        posts#update
                       DELETE /categories/:category_id/posts/:id(.:format)                        posts#destroy

如何调整路线以补偿嵌套?或者有更好的方法来嵌套吗?

2 个答案:

答案 0 :(得分:1)

您需要在posts资源下定义另一个嵌套category的块:

# Existing
resources :posts do 
  resources :comments
end

# Additional block
resources :categories do  
  resources :posts do
    resources :comments
  end
end

使用附加区块,您现有的路线保持不变,因此现有路线不会中断!

最好将路线限制为仅需要/使用的路线。例如,如果您只需要/categories/:category_id/postsindex,那么您的路线将更新为:{/ p>

posts_controller

通过这种方式,您可以更好地控制路径并提高应用程序的可维护性。

答案 1 :(得分:0)

如果您想使用嵌套路线并仍然保留原始网址,那么

vee的答案是正确的。如果您的网站处于实时状态并且更改网址会影响指向索引网页的链接,则建议您这样做。

否则,您应该指向嵌套资源的链接,如下所示:

<%= link_to post.title, [post.category, post] %>

请参阅:Rails - link_to, routes and nested resources