Rails 3没有id的资源路由

Zac*_*ght 18 routing ruby-on-rails

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

resources :posts, :except => :show
Run Code Online (Sandbox Code Playgroud)

这为节目路线产生了(我没有排除它),

/post/:id
Run Code Online (Sandbox Code Playgroud)

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

/:year/:month/:day/:url_title
Run Code Online (Sandbox Code Playgroud)

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

match "/:year/:month/:day/:url_title", :to => "posts#show", :as => :post
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jes*_*ott 22

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

class Post < ActiveRecord::Base
  ...
  def to_param
    "#{year}/#{month}/#{day}/#{title.parameterize}"
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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