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