我希望我的网站网址看起来像这样:
example.com/2010/02/my-first-post
我的Post
模型有slug
字段('my-first-post')和published_on
字段(我们将从中扣除网址中的年份和月份).
我希望我的Post
模型是RESTful,所以url_for(@post)
像他们应该的工作,即:它应该生成上述url.
有没有办法做到这一点?我知道你需要覆盖to_param
并map.resources :posts
使用:requirements
选项集,但我无法全部工作.
我几乎完成了,我90%在那里.使用resource_hacks插件我可以实现这个目的:
map.resources :posts, :member_path => '/:year/:month/:slug', :member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/} rake routes (...) post GET /:year/:month/:slug(.:format) {:controller=>"posts", :action=>"show"}
并在视图中:
<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>
生成适当的example.com/2010/02/my-first-post
链接.
我也想这样做:
<%= link_to 'post', post_path(@post) %>
但它需要覆盖to_param
模型中的方法.应该相当容易,除了事实,to_param
必须返回String
,而不是Hash
我喜欢它.
class Post < ActiveRecord::Base def to_param {:slug => 'my-first-post', :year => '2010', :month => '02'} end end
导致can't convert Hash into String
错误.
这似乎被忽略了:
def to_param '2010/02/my-first-post' end
因为它导致错误:( post_url failed to generate from {:action=>"show", :year=>#