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)