2010-02-15 101 views
6

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

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

回答

4

在模型中定义to_param方法,所有的网址助手将忧色你与该方法返回的内容,如:

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

你也需要去适应你的控制器,用于那。替换:

Post.find(params[:id]) 

有:

Post.find_by_slug(params[:id]) 

还要注意的是找到方法引发的ActiveRecord :: RecordNotFound异常,当同时使用find_by_ *方法不存在例外情况,从而提高了记录无法找到你需要手动检查。

0

或者......

添加这样的方法来application_helper.rb

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

然后使用你的意见以下(使用permalink(@post)代替post_path

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

或者.. 。

添加这样的方法来post.rb

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

然后使用按照您的看法:

2

你可以找到friendly_id插件有用,因为它也将处理重定向,如果您重新命名蛞蝓(因此搜索引擎友好),处理名称冲突并无缝集成find方法,因此您不需要触摸控制器方法(除重定向之外)。