ARTLoe
ARTLoe

Reputation: 1799

Customising rails Routes for user - Rails 4

could one advise me how to get a url like this in rails

http://www.example.com/users/5/ian

i tried the below but unsure:

route file:
devise_for :users
  resources :users do
    resources :socials
  end
  get '/users/:id/:firstname', controller: 'users', action: 'show'

users_controller.rb

def show
    @user = User.find(params[:id], params[:firstname])
  end

Upvotes: 1

Views: 40

Answers (3)

Tim Lawrenz
Tim Lawrenz

Reputation: 338

If you are trying to achieve 'friendly urls' then I suggest using this:

You don't have to create a special route:

get '/users/:id', controller: 'users', action: 'show'

Instead you have your model overwrite the to_param method:

class User
  ...
  def to_param
    "#{id}-#{firstname.try(:parameterize)}"
  end
  ...
end

The url helper calls to_param to build the urls. If you overwrite it this way, you will receive a url like this:

http://localhost:3000/users/1-artloe

The rails find method calls .to_i on the params[:id] which, thankfully, interprets strings as number until it arrives at a character that can't become a number.

Examples:

'123abcde'.to_i # 123
'123-asdf'.to_i # 123
'asdf-123'.to_i # 0

So except for overwriting to_param, you don't have to do anything.

Upvotes: 1

max
max

Reputation: 101811

If what you are trying accomplish is "friendly urls" you would do it by:

# GET /users/1
# GET /users/joe
def show
  @user = User.find_by!('id = :x OR firstname = :x', x: params[:id]) 
end

However you must ensure that property you are using in URLs is URL safe and unique. Usually a separate username or slug field is used. Nothing special is needed in terms of routes.

These gems provide "friendly urls":

Upvotes: 1

Deepak Mahakale
Deepak Mahakale

Reputation: 23661

Try replacing this

def show
  @user = User.find_by_id_and_firstname(params[:id], params[:firstname])
end

Upvotes: 1

Related Questions