Rails路由 – 资源的自定义路由

我正在构建一个Rails应用程序,我想坚持所有那些花哨的东西,如REST和资源,但我想稍微自定义我的路线。 我希望我的GET路线更加冗长 – 我正在创建的应用程序是一个简单的博客,所以我不喜欢GET /posts/1-my-first-post而是喜欢GET /posts/1-my-first-post

任何想法如何做到这一点? 没有在网上找到任何东西。

路线:

 map.resources :posts 

模型:

 class Post < ActiveRecord::Base def to_param "#{id.to_s}-#{slug}" end end 

应该做的伎俩。

顺便说一句: http : //railscasts.com/episodes/63-model-name-in-url

在您的模型中定义一个to_param方法,所有url帮助器将使用该方法返回您返回的内容,例如:

 class Post < ActiveRecord::Base der to_param slug end end 

您还需要为此调整控制器。 更换:

 Post.find(params[:id]) 

有:

 Post.find_by_slug(params[:id]) 

另请注意,当使用find_by_ *方法时无法找到记录时,find方法会引发ActiveRecord :: RecordNotFoundexception,不会引发exception,因此您需要手动检查。

您可以找到friendly_id插件很有用,因为它还可以处理重定向,如果您重命名slug(因此seo友好),处理名称冲突并与find方法无缝集成,因此您不需要触摸您的控制器方法(重定向除外)啄)。

另外…

将这样的方法添加到post.rb

 def path "/posts/#{id}-#{slug}" end 

然后在您的视图中使用以下内容:

另外…

将这样的方法添加到application_helper.rb

 def permalink(post) "#{post_path(post)}-#{post.slug}" end 

然后在视图中使用以下内容(使用permalink(@post)而不是post_path

 <%= link_to @post.title, permalink(@post) %>