开发者

How to user defined friendly URLs in Rails 3?

Now i have something like this

http://myapp.com/pages/1
http://myapp.com/pages/2
http://myapp.com/pages/3
http://myapp.com/pages/4

And each page belong to one user

What i need is to each user to set it's own custom name for the page.

I was thinking of using the friendly_id gem http://norman.github.com/friendly_id/ but I don't find any method to directly edit the开发者_高级运维 slug to set a custom friendly url

how should i proceed?


FriendlyID is a great gem.

It shouldn't be hard to implement user defined page URL. Create table pages with user_id and link

class User < ActiveRecord::Base
  has_many :pages

class Page < ActiveRecord::Base
  belongs_to :user

  has_friendly_id :link # link is name of the column whose value will be replaced by slugged value

On the page#new you add an input for the link attribute.

Alternatively, you could set friendly_id on title or something else with :use_slug => true option. This way FriendlyID will take the title and modify it so it doesn't have and restricted characters. It will use it's own table to store slugs. Use cached_slug to increase performanse.

Updated

To give users a choice whether they wan't to set a custom link, you could do this:

  1. Set friendly_id on the link field without slugs..
  2. Make a virtual attribute permalink so you could show it in your forms.
  3. In the before_filter, check whether the permalink is set.
  4. If it is, write it to the link field.
  5. If it's not, write title to the link field.

FriendlyID uses babosa gem to generate slugs. If you decide to use it as well, this is how your filter could look like:

protected
  def generate_link
                #you might need to use .nil? instead
    self.link = self.permalink.empty? ? make_slug(self.title) : make_slug(self.permalink)
  end

  def make_slug(value)
    value.to_slug.normalize.to_s #you could as well use ph6py's way
  end


Adding to_param method to one of the models should help:

def to_param
  "#{id}-#{call_to_method_that_returns_custom_name.parameterize}"
end

Hope this is what you are looking for :)


I am not using the friendly_url gem and am not sure whether my way is efficient. But it works fine for me.

I have a model called Node with id and friendly url field called url_title.

My routes.rb file:

resource 'nodes/:url_title', :to => 'Nodes#view'

nodes_controller.rb

class NodesController <ActiveController
 def view
  @node = Node.find_by_url_title(:params(url_title))
 end
end

And use the @node variable to populate your view.

Now, whenever I type www.example.com/nodes/awesome-title , it takes me to the proper page. One argument against this can be need to create an index on a non-primary field. But I think that might be required for better performance even in the friendly_url gem. Also, the non-primary field url_title needs to be unique. Again, this might be required even for correct working for friendly_url . Feel free to correct me if I am wrong in these assumptions.


There are a variety of ways, you can achieve this-

1) using Stringex

2) sluggable-finder

3) friendly_id

A complete step by step methodology with reasons for each to be used can be found out here. Happy reading!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜