Rails 3没有id的资源路由

我正在Rails 3上创建一个博客应用程序,我想覆盖为post生成的默认show route

resources :posts, :except => :show 

为节目路线生成的(我没有排除它),

 /post/:id 

我希望我的路由看起来像这样,其中url_title是我的模型在before_save上生成的字符串,其中它删除非字母数字字符并用连字符替换空格。

 /:year/:month/:day/:url_title 

我试图用这段代码来完成这个:

 match "/:year/:month/:day/:url_title", :to => "posts#show", :as => :post 

从理论上讲,这应该允许我调用post_path(@ post)(其中@post是我的post类的一个实例),它应该能够排除这个路径,它几乎可以工作。

唯一的问题是它试图用年份替换post的id。 其他字段填写正确。 我认为这种情况正在发生,因为rails有一些默认行为使得它真的,真的想在URL中拥有id,并且它不相信我使用我自己的唯一标识符(在本例中为post.url_title)。

我可能错了。 任何人都有这种路由的经验,或知道是什么?

您可以使用to_param来制作rails用途

 class Post < ActiveRecord::Base ... def to_param "#{year}/#{month}/#{day}/#{title.parameterize}" end end 

更多信息: http : //api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param和http://www.seoonrails.com/to_param-for-better-looking-urls.html

如果你走这条路线,你会想要创建一个永久链接属性,并使用Post.find_by_permalink(params[:id] )而不是Post.find(params[:id])

你应该使用这样的路径

 post_path(@post, :year => 2010, :month => 3, :day => 16) 

要么

 post_path(@post, :year => @post.created_at.year, :month => @post.created_at.month, :day => @post.created_at.day)