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 方法

在没有在模型中定义的情况下在 rails 中创建 slug

清理 URL slug 的 Unicode 字符串(Ruby/Rails)

Rails:Friendly_id 不会为旧记录生成 slug

rails 4 gem 'mongoid_slug' 无法按 id 搜索

Symfony 5 - 在类别 url 中显示 id 和 slug 并在更新 slug 时通过 id 找到它