设计登录一个模型,但两个不同的布局

时间:2015-11-17 10:26:06

标签: ruby-on-rails-4 devise

这可能是一个愚蠢的问题,但它让我感到害怕

假设我有adminapplication布局。我有以下代码:

# For admin layout
class Admin::BaseController < ApplicationController
  layout 'admin'
  before_action :authenticate_user!
end

# For application layout
class DashboardController < ApplicationController
  before_action :authenticate_user, only: :index

  def index
  end
end

现在,我访问/admin并将其重定向到users/sign_in,除非我已登录用户。同样,如果我访问dashboards同样的事情会发生。

  

还要注意,我使用user设计模型来存储用户信息,使用role来存储用户角色。这意味着,管理员用户可以访问admin布局,other role用户可以访问application布局。

要求:

就像我为admin用户分隔了管理员用户application布局和other role布局一样。

我想分隔adminapplication布局的登录布局。

如果用户正在访问/admin,那么他们应该重定向到admin登录布局,如果用户正在访问/dashboards,他们应该重定向到application布局,如果他们没有登录

1 个答案:

答案 0 :(得分:0)

您可以在Admin Base控制器中设置会话变量,如:

orm:
    entity_managers:
        # A collection of different named entity managers (e.g. some_em, another_em)
        some_em:
            metadata_cache_driver:
                type:                 array # Required
                host:                 ~
                port:                 ~
                instance_class:       ~
                class:                ~

然后在ApplicationContoller中设置如下布局:

class Admin::BaseController < ApplicationController

  # Set the admin layout
  before_action :use_admin_layout  
  before_action :authenticate_user!

  private 

    def use_admin_layout
      session[:admin_layout] = true
    end

end

您只需考虑清除任何NON管理控制器的会话。可能在before_action中。只需将其添加到您的ApplicationConroller

即可
layout "admin" if session[:use_admin_layout]

并在必要时拨打电话:

private

    def clear_admin_layout
      session[:admin_layout] = nil
    end