Search code examples
ruby-on-railsruby-on-rails-3routesruby-on-rails-3.2rails-routing

Rails Routes based on condition


I have three roles: Instuctor, Student, Admin and each have controllers with a "home" view.

so this works fine,

get "instructor/home", :to => "instructor#home"
get "student/home", :to => "student#home"
get "admin/home", :to => "admin#home"

I want to write a vanity url like below which will route based on the role of the user_id to the correct home page.

get "/:user_id/home", :to => "instructor#home" or "student#home" or "admin#home"

How do I accomplish this?


Solution

  • You can't do this with routes because the routing system does not have the information required to make this decision. All Rails knows at this point of the request is what the parameters are and does not have access to anything in the database.

    What you need is a controller method that can load whatever data is required, presumably the user record, and redirects accordingly using redirect_to.

    This is a fairly standard thing to do.

    Update:

    To perform all of this within a single controller action you will need to split up your logic according to role. An example is:

    class HomeController < ApplicationController
      def home
        case
        when @user.student?
          student_home
        when @user.admin?
          admin_home
        when @user.instructor
          instructor_home
        else
          # Unknown user type? Render error or use a default.
        end
      end
    
    protected
      def instructor_home
        # ...
        render(:template => 'instructor_home')
      end
    
      def student_home
        # ...
        render(:template => 'student_home')
      end
    
      def admin_home
        # ...
        render(:template => 'admin_home')
      end
    end