I’m learning Rails by building a shop application and I’m having a bit of trouble with redirects. I have 3 roles in the application:
- Buyer
- Seller
- Administrator
Depending on which type they are logged in as then I would like to redirect to a different page/action but still show the same URL for each (http://…/my-account).
I don’t like having to render partials in the same view, it just seems messy, is there another way to achieve this?
The only way I can think of is to have multiple actions (e.g. buyer, seller, administrator) in the accounts controller but that means the paths will look like http://…/my-account/buyer or http://…/my-account/seller etc.
Many thanks,
Roger
I’ve put my code below:
models/user.rb
class User < ActiveRecord::Base
def buyer?
return type == 'buyer'
end
def seller?
return type == 'seller'
end
def administrator?
return type == 'administrator'
end
...
end
controllers/accounts_controller.rb
class AccountsController < ApplicationController
def show
end
end
controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
def new
@user_session = UserSession.new
end
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
if session[:return_to].nil?
# I'm not sure how to handle this part if I want the URL to be the same for each.
redirect_to(account_path)
else
redirect_to(session[:return_to])
end
else
@user_session.errors.clear # Give as little feedback as possible to improve security.
flash[:notice] = 'We didn\'t recognise the email address or password you entered, please try again.'
render(:action => :new)
end
end
def destroy
current_user_session.destroy
current_basket.destroy
redirect_to(root_url, :notice => 'Sign out successful!')
end
end
config/routes.rb
match 'my-account' => 'accounts#show'
Many thanks,
Roger
In
UserSessionsController#create(i.e.: the login method) you could continue to redirect to the account path (assuming that goes toAccountsController#show) and then render different views according to the role. I.e.: something like this:Better yet, you could do this by convention…