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

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

除了资源路径之外,您还需要添加带路线全球的常规路线(当然假设您的路线路线是如何定义的)。 例如,

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

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

您可以通过简单地覆盖模型中的to_param方法,在表单中创建一个URL:“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 

使用friendly_id 。 它有一个很好的function:你可以更新你的url而不会破坏旧url。

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

 def to_param self.friendly_id end 

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

stringex gem包含ActsAsUrl,用于创建属性的URI友好表示

https://github.com/rsl/stringex

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

我在Rails 3中写了一篇关于slugs 的post 。它提供了漂亮的URL,甚至更多,保护你的网站免受随机脚本的限制,只需增加ID即可获取信息。 它还避免了在数据库中保存slu ..