ID + Slug name in URL in Rails (like in StackOverf

2020-02-19 08:06发布

I'm trying to achieve URLs like this in Rails:

http://localhost/posts/1234/post-slug-name

with both ID and slug name instead of either

http://localhost/posts/1234

or

http://localhost/posts/post-slug-name

(right now I have just slug name in URL, so this part is over). How can I do this?

UPD

I found an article on this: http://augustl.com/blog/2009/styling_rails_urls/, instead of /id/slug it suggests to use /id-slug which works perfectly for me, so I'll go with this.

6条回答
姐就是有狂的资本
2楼-- · 2020-02-19 08:15

the stringex gem contains ActsAsUrl to create URI-friendly representations of an attribute

https://github.com/rsl/stringex

It also contains a Unidecoder library, which can convert Unicode to ASCII.

查看更多
\"骚年 ilove
3楼-- · 2020-02-19 08:23

You'll want to add a regular route with Route Globbing in addition to your resource route (assuming of course that's how your posts routes are defined). For example,

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
查看更多
别忘想泡老子
4楼-- · 2020-02-19 08:29

I know the question is quite old but I think it still deserves some interest and none of the answers are up-to-date or provide a way to generate exactly what the OP was looking for (i.e. http://localhost/posts/1234/post-slug-name).

In routes.rb

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'

Then in the views

<%= link_to slugged_post_path(post, post.name.parameterize) %>

You might want to define a slug method in your model to avoid calling parameterize in the views.

查看更多
甜甜的少女心
5楼-- · 2020-02-19 08:33

Rails has some built-in support for SEO friendly URLs.

You can create a url in the form: "id-title" by simply overriding the to_param method in your model.

This is from one of my projects and creates a url with the id, category name and model name:

def to_param
  "#{id}-#{category.name.parameterize}-#{name.parameterize}"
end 

Rails is smart enough to extract this back into the plain id when you access your controller action, so the following just works:

def show
  @model = Model.find(params[:id])
  render :action => "show"
end
查看更多
Lonely孤独者°
6楼-- · 2020-02-19 08:34

Use friendly_id. It has one nice feature: you can update your url without breaking the old one.

Generating view url isn't working for me. I just added a small method in the model

def to_param
  self.friendly_id
end
查看更多
疯言疯语
7楼-- · 2020-02-19 08:37

I wrote a post about slugs in Rails 3. It provides pretty URL's and even more, secures your site from random scripts that ask for information just by increasing ID's. Also it avoids saving slugs in the database.

查看更多
登录 后发表回答