shivam
shivam

Reputation: 16506

Variable root in Rails router

I have completely re-written our Single Page Application (SPA) using a different technology, however instead of enforcing new UI to all the users, I would like them to opt to try new UI and similarly switch back to old UI, before enforcing the new UI to every user. The new UI was written keeping this is mind, however in routes.rb I need to define root manually to pick one of them. Ex:

root :to => 'dash#new' # for new UI

or

root :to => 'dash#old' # for old UI

How can this be achieved automatically? Something like:

Upvotes: 2

Views: 109

Answers (2)

Kimmo Hintikka
Kimmo Hintikka

Reputation: 15410

If you had user object in routes it would be really easy.

Something like devise gem gives that to you out of the box. It allows you also define boolean triggers to user model.

For example I have default false admin tag that actually changes the route. Devise MODEL always gives you routes automatically so if you generate

rails g devise User you will have devise_for :users that you can use in your routes.

devise_for :admin do
  root to: "admin#index"
end

root to: "home#index"

Without having user model there you can still define roots in controller but how you you persist them per user?

Upvotes: 0

Richard Peck
Richard Peck

Reputation: 76774

You'd be best changing the layout in the controller, not middleware...

#config/routes.rb
root "dash#index"

#app/controllers/dash_controller.rb
class DashController < ActionController::Base
  before_action :authenticate_user!, :set_layout

  def index
    current_user.newui?
      # define data
    else
      # old data
    end
  end

  private

  def set_layout
    layout (current_user.newui? "new" : "old")
  end
end

You must remember that your "routes" are like a menu - you pick what you want and browse to it.

What is delivered from those routes is entirely dependent on the controller. In both instances, you're trying to invoke the dash#index action; what you're trying to do is ascertain whether the user has a different preference for how that will be displayed.

Since the middleware is meant to deal with the request (it doesn't know about the User), you'll be best using the controller to make the change.

Upvotes: 3

Related Questions