Rails:用于自定义操作的model_url

时间:2010-06-24 05:58:53

标签: ruby-on-rails rails-routing

假设我有简单的rails博客应用程序。

我有一个自定义操作,例如page_views,显示帖子的观看次数。

class PostsController < ApplicationController

  def page_views
     #show some page views
  end

end

app/views/Posts文件夹中还有一个关联的视图。

现在,在routes.rb我有:

map.resources :posts

map.resources :posts, :collection => {
                                      :page_views=> :get
                                      }

在我的帖子show.html.erb文件中,我有一个指向page_views视图的链接:

link_to("View Page Views",page_views_posts_path + "/" + post.id.to_s)

另一个paths

page_views_posts_path(post)
page_views_path(post)
page_views_posts(post)

导致找不到方法或网址不正确,例如:

http://localhost:3000/posts/page_views.#<posts:0xabcdef00>

我认为网址应为:

http://localhost:3000/posts/page_views/1

那么,我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

如果您想为每个视图提供page_views页面,您应该将额外操作声明为收集方法,而不是成员方法:

map.resources :posts, :member => { :page_views=> :get }

此外,如果您也想要所有帖子(显示某些排名表),请添加与收集操作相同的参数:

map.resources :posts, :member => { :page_views=> :get }, :collection => { :page_views => :get }

这样您就可以生成以下路线:

page_views_post_path(post) # for single post
page_views_posts_path      # for all posts

您可以通过运行以下命令来检查新路由:

$ rake routes | grep page_views

考虑到您没有为其他控制器声明它们,您将只获得那些相关的视图。

答案 1 :(得分:0)

您还可以像这样向 routes.rb 中的资源添加自定义方法:

resources :posts do 
  collection do
    get :page_views
  end
end

并使用 page_views_posts_path 访问自定义方法。