How do I rewrite URL's based on title?

2019-02-19 23:36发布

问题:

This is a fairly open-ended question, and I'm just looking for the best possible avenue.

Users can post links with titles. And I want my URL's for SEO purposes to display those titles. Much in the same way I believe stackoverflow works.

So if the title is "My foobar just made out with my cat"

I would like the URL to be : www.website.com/posts/My-foobar-just-made-out-with-my-cat

Any ideas?

Thanks so much in advance!!

回答1:

I used this in an old Rails 2.x app. There may be a better approach to scrubbing the title...

(goes in your model)

def to_param
  seo_uri
end

def seo_uri
  "#{self.id}-#{self.title.gsub(/[^a-z0-9]+/i, '-').gsub(/-{2}/, '-').gsub(/-$/, '')}"
end

Hope this helps!

UPDATE

Comments on this answer indicated there is a new method available for Rails 3 users: #parameterize. The Rails API document for this method shows how it should be used (cut-n-paste):

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

@person = Person.find(1)
# => #<Person id: 1, name: "Donald E. Knuth">

<%= link_to(@person.name, person_path %>
# => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>


回答2:

There's a really awesome plugin, FriendlyId which will handle all this for you. Loads of really clever features, including scopes and handling of 301 redirects on title change. This differs from stackoverflow and Brian's method in that the id isn't used in the url.