Rails中URL中的ID + Slug名称(如StackOverflow中)

时间:2010-04-13 19:53:01

标签: ruby-on-rails url slug

我正在尝试在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,这对我来说非常合适,所以我会选择这个。

6 个答案:

答案 0 :(得分:30)

Rails对SEO友好URL有一些内置支持。

您可以通过简单地覆盖模型中的 to_param 方法,在表单中创建一个网址:“id-title”。

这来自我的一个项目,并创建一个包含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

答案 1 :(得分:9)

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

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'

答案 2 :(得分:7)

使用friendly_id。它有一个很好的功能:你可以更新你的网址而不会破坏旧网址。

生成视图网址对我不起作用。我刚刚在模型中添加了一个小方法

def to_param
  self.friendly_id
end

答案 3 :(得分:4)

我知道这个问题很老但我认为它仍然值得一些兴趣,而且没有一个答案是最新的,或提供一种方法来准确生成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方法,以避免在视图中调用参数化。

答案 4 :(得分:0)

stringex gem包含ActsAsUrl,用于创建属性

的URI友好表示

https://github.com/rsl/stringex

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

答案 5 :(得分:0)

I wrote a post关于Rails 3中的slug。它提供了漂亮的URL,甚至更多,保护您的网站免受随机脚本的限制,只需增加ID就可以获取信息。它还避免了在数据库中保存slu ..