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 ..
- SQLite3和Postgres / Heroku Ruby on Rails查询问题
- 在Ruby中,我应该使用|| =还是定义? 记忆?
- CORS – 不允许JSONP的跨域AJAX,允许在服务器上使用Origin
- Rails 3.如何在模型中将数字显式舍入到小数点后两位?
- 迁移时需要使用add_index来获取belongs_to / has_many关系吗? (Rails 3.2,Active Record)
- Rails Cancan:在注册时定义默认角色
- 我希望使用带有Ruby on Rails的.find()返回单个结果
- Rails资产管道:如何创建自定义清单文件
- Gem-idea:当HTTP方法发布,放置或删除时,在before_filter中使用validation码自动保护垃圾邮件