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

Vit*_*aly 16 url ruby-on-rails slug

我正在尝试在Rails中实现这样的URL:

http://localhost/posts/1234/post-slug-name
Run Code Online (Sandbox Code Playgroud)

同时使用ID和slug名称而不是其中之一

http://localhost/posts/1234
Run Code Online (Sandbox Code Playgroud)

要么

http://localhost/posts/post-slug-name
Run Code Online (Sandbox Code Playgroud)

(现在我在URL中只有slug名称,所以这部分结束了).我怎样才能做到这一点?

UPD

我发现了一篇关于此的文章:http://augustl.com/blog/2009/styling_rails_urls/,而不是/id/slug建议使用/id-slug哪种方式对我来说非常有效,所以我会选择这个.

Tob*_*ede 30

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

您可以通过简单地覆盖模型中的to_param方法,在表单中创建一个URL:"id-title" .

这来自我的一个项目,并创建一个包含id,类别名称和模型名称的URL:

def to_param
  "#{id}-#{category.name.parameterize}-#{name.parameterize}"
end 
Run Code Online (Sandbox Code Playgroud)

当您访问控制器操作时,Rails非常智能,可以将其提取回普通ID,因此以下内容正常工作:

def show
  @model = Model.find(params[:id])
  render :action => "show"
end
Run Code Online (Sandbox Code Playgroud)


小智 9

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

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
Run Code Online (Sandbox Code Playgroud)


Yea*_*een 7

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

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

def to_param
  self.friendly_id
end
Run Code Online (Sandbox Code Playgroud)