【问题标题】:Rails routing - custom routes for ResourcesRails 路由 - 资源的自定义路由
【发布时间】:2011-01-17 03:34:53
【问题描述】:
我目前正在构建一个 Rails 应用程序,我想坚持所有那些花哨的东西,比如 REST 和资源,但我想稍微自定义一下我的路线。我希望我的 GET 路由更冗长一些 - 我正在创建的应用程序是一个简单的博客,所以我更喜欢 GET /posts/1-my-first-post 之类的东西,而不是 GET /posts/1。
任何想法如何做到这一点?在网上没有找到任何东西。
【问题讨论】:
标签:
ruby-on-rails
ruby
resources
routes
【解决方案2】:
在你的模型中定义一个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::RecordNotFound 异常,不会引发异常,因此您需要手动检查。
【解决方案3】:
您会发现friendly_id 插件很有用,因为它还可以在您重命名 slug 时处理重定向(因此对 seo 友好)、处理名称冲突并与 find 方法无缝集成,因此您无需触摸控制器方法(除了重定向的东西)。
【解决方案4】:
或者...
将这样的方法添加到post.rb
def path
"/posts/#{id}-#{slug}"
end
然后在您的视图中使用以下内容:
【解决方案5】:
或者...
将这样的方法添加到application_helper.rb
def permalink(post)
"#{post_path(post)}-#{post.slug}"
end
然后在您的视图中使用以下内容(使用permalink(@post) 而不是post_path)
<%= link_to @post.title, permalink(@post) %>