我正在构建一个Rails应用程序,我想坚持所有那些奇特的东西,如REST和资源,但我想自定义我的路线。我希望我的GET路线更加冗长 - 我创建的应用程序是一个简单的博客,所以我不喜欢GET /posts/1
,我喜欢GET /posts/1-my-first-post
之类的东西。Rails路由 - 资源的自定义路由
任何想法如何做到这一点?没有在网上找到任何东西。
我正在构建一个Rails应用程序,我想坚持所有那些奇特的东西,如REST和资源,但我想自定义我的路线。我希望我的GET路线更加冗长 - 我创建的应用程序是一个简单的博客,所以我不喜欢GET /posts/1
,我喜欢GET /posts/1-my-first-post
之类的东西。Rails路由 - 资源的自定义路由
任何想法如何做到这一点?没有在网上找到任何东西。
路线:
map.resources :posts
型号:
class Post < ActiveRecord::Base
def to_param
"#{id.to_s}-#{slug}"
end
end
应该做的伎俩。
在模型中定义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_ *方法不存在例外情况,从而提高了记录无法找到你需要手动检查。
或者......
添加这样的方法来application_helper.rb
def permalink(post)
"#{post_path(post)}-#{post.slug}"
end
然后使用你的意见以下(使用permalink(@post)
代替post_path
)
<%= link_to @post.title, permalink(@post) %>
或者.. 。
添加这样的方法来post.rb
def path
"/posts/#{id}-#{slug}"
end
然后使用按照您的看法:
你可以找到friendly_id插件有用,因为它也将处理重定向,如果您重新命名蛞蝓(因此搜索引擎友好),处理名称冲突并无缝集成find方法,因此您不需要触摸控制器方法(除重定向之外)。