17

我正在尝试在 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对我来说非常有效的方法,所以我会选择这个。

4

6 回答 6

30

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
于 2010-04-13T23:31:19.150 回答
9

除了资源路由之外,您还需要使用Route Globbing添加常规路由(当然假设您的posts路由是这样定义的)。例如,

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
于 2010-04-13T20:13:44.323 回答
7

使用friendly_id。它有一个不错的功能:您可以在不破坏旧网址的情况下更新您的网址。

生成视图 url 对我不起作用。我只是在模型中添加了一个小方法

def to_param
  self.friendly_id
end
于 2011-03-09T05:50:28.717 回答
4

我知道这个问题已经很老了,但我认为它仍然值得一些兴趣,而且没有一个答案是最新的,也没有提供一种方法来准确生成 OP 正在寻找的内容(即http://localhost/posts/1234/post-slug-name)。

在路线.rb

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'

然后在视图中

<%= link_to slugged_post_path(post, post.name.parameterize) %>

您可能希望在模型中定义一个 slug 方法以避免在视图中调用参数化。

于 2016-02-27T11:55:16.273 回答
0

stringex gem 包含 ActsAsUrl 以创建属性的 URI 友好表示

https://github.com/rsl/stringex

它还包含一个 Unidecoder 库,可以将 Unicode 转换为 ASCII。

于 2012-04-30T14:26:21.797 回答
0

我在 Rails 3 中写了一篇关于 slugs 的文章。它提供了漂亮的 URL,甚至更多,保护您的站点免受随机脚本的影响,这些脚本仅通过增加 ID 来询问信息。它还避免了在数据库中保存 slug。

于 2012-05-16T04:26:06.533 回答