先简单说一下我的情况:有一个posts的controller,它负责CRUD等一系列操作,现在有一个需求是列出“我评论过的文章”的列表,最初我是这样设计的
in app/controllers/posts_controller.rb
def my_replied # ignore codes end
这样写有一个好处,就是产生的路由很易懂,如浏览器的地址栏会显示/posts/my_replied,在ERB文件中书写路由时是my_replied_posts_path,这甚至和英文表达的方式几乎一致,所以这是一种漂亮的表达方式。
现在突然需要列出很多和“我的”相关的需求,如“我小组中的文章”,“我回答过的”,“我自己发表的”等等,所以我打算把这个controller移到目录my下面,变成了app/controllers/my/posts_controller.rb,这时的action还和上面一样,但路由的写法就变了
in routes.rb
namespace :my do resources :posts do collection do get :my_replied end end end
这时在地址栏显示的内容就成了/my/posts/my_replied,看,有一个多余的“my”,在ERB文件中显得更加不易读,变成了my_replied_my_posts_path。
不知道各位是否遇到过这个情况,或者在这个过程中我是否做了不必要的东西?
个人觉得用restful的方式比较好,应该尽量避免其他action的出现。
“我的”相关的需求,如: “我评论过的文章”,“我小组中的文章”,“我回答过的”,“我自己发表的”这些只是一个筛选类型而已,可以通过一个参数即可如:type,都到index 方法处理就好,这样可以很清楚
可以这样写:
[code="ruby"]
namespace :my do
resources :posts
end
[/code]
因此路由可以这样写:
[code="ruby"]
my_posts_path(:type=>'replied')
my_posts_path(:type=>'group')
my_posts_path(:type=>'answered')
my_posts_path(:type=>'me')
[/code]
用path_prefix => '',把文件名隐藏
最简单的办法:
[code="ruby"]
map.connect "/posts/my_replied",:controller => "/my/posts", :action=>"my_replied"
[/code]
这样就可以通过/posts/my_replied访问到。