Rails 中 URL 中的 ID + Slug 名称(如 *** 中)
Posted
技术标签:
【中文标题】Rails 中 URL 中的 ID + Slug 名称(如 *** 中)【英文标题】:ID + Slug name in URL in Rails (like in ***) 【发布时间】:2011-02-07 15:09:01 【问题描述】:我正在尝试在 Rails 中实现这样的 URL:
http://localhost/posts/1234/post-slug-name
同时使用 ID 和 slug 名称,而不是其中任何一个
http://localhost/posts/1234
或
http://localhost/posts/post-slug-name
(现在我的 URL 中只有 slug 名称,所以这部分结束了)。我该怎么做?
UPD
我找到了一篇关于此的文章:http://augustl.com/blog/2009/styling_rails_urls/,而不是/id/slug
,它建议使用/id-slug
,这对我来说非常有效,所以我会继续这样做。
【问题讨论】:
【参考方案1】:除了资源路由之外,您还需要使用Route Globbing 添加常规路由(当然假设您的posts
路由是这样定义的)。例如,
map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
【讨论】:
【参考方案2】:Rails 对 SEO 友好的 URL 有一些内置支持。
您可以通过简单地覆盖模型中的 to_param 方法以“id-title”的形式创建一个 url。
这是来自我的一个项目,并创建了一个带有 id、类别名称和模型名称的 url:
def to_param
"#id-#category.name.parameterize-#name.parameterize"
end
Rails 足够聪明,可以在您访问控制器操作时将其提取回普通 id 中,因此以下方法可以正常工作:
def show
@model = Model.find(params[:id])
render :action => "show"
end
【讨论】:
是的,这就是我在 UPD 中所拥有的。我其实也用过这种方法。【参考方案3】:使用friendly_id。它有一个不错的功能:您可以在不破坏旧网址的情况下更新您的网址。
生成视图 url 不适合我。我只是在模型中添加了一个小方法
def to_param
self.friendly_id
end
【讨论】:
【参考方案4】:stringex gem 包含 ActsAsUrl 以创建属性的 URI 友好表示
https://github.com/rsl/stringex
它还包含一个 Unidecoder 库,可以将 Unicode 转换为 ASCII。
【讨论】:
【参考方案5】:I wrote a post 关于 Rails 3 中的 slug。它提供了漂亮的 URL,甚至更多,保护您的网站免受随机脚本的影响,这些脚本仅通过增加 ID 来询问信息。它还避免了在数据库中保存 slug。
【讨论】:
【参考方案6】:我知道这个问题已经很老了,但我认为它仍然值得引起一些兴趣,而且没有一个答案是最新的,也没有提供一种方法来生成 OP 正在寻找的内容(即http://localhost/posts/1234/post-slug-name
)。
在 routes.rb 中
get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'
然后在视图中
<%= link_to slugged_post_path(post, post.name.parameterize) %>
您可能希望在模型中定义一个 slug 方法以避免在视图中调用参数化。
【讨论】:
在link_to
调用中应该是slugged_post_path
。以上是关于Rails 中 URL 中的 ID + Slug 名称(如 *** 中)的主要内容,如果未能解决你的问题,请参考以下文章
了解 Rails 模型中的 slug_candidates 方法
清理 URL slug 的 Unicode 字符串(Ruby/Rails)
Rails:Friendly_id 不会为旧记录生成 slug