首页 > 解决方案 > 登录Rails后如何检查用户的角色?

问题描述

我试图在登录(设计)后检查用户的角色,所以在用户模型中,我必须role:学生和老师

我的user模型:

class User < ActiveRecord::Base
  enum role: {student: 0, teacher: 1}

  belongs_to :user
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :posts

  after_initialize do
  if self.new_record?
    self.role ||= :student
  end
end
end

所以现在my application.html.erb我想根据不同的用户角色检查并显示不同的导航栏:

<% if user_signed_in? %>
<% if teacher? %>
<!-- show navbar for teacher -->
<% else %>
<!-- show navbar for student -->
<% end %>
<% else %>
<!-- show login/reg buttons -->
<% end %>

这是我的application控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
  helper_method :teacher? , :student?

  def teacher?
      current_user.role = User.where(role: [:teacher])
  end

  def student?
    current_user.role = User.where(role: [:student])
  end

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
      devise_parameter_sanitizer.permit(:account_update, keys: [:name])
    end
end

标签: ruby-on-rails

解决方案


你的方法真的很糟糕,删除它们ApplicationController#teacher?ApplicationController#student?使用内置的User#teacher?User#student?代替:

<% if current_user.teacher? %> 

顺便说一句,您也不需要after_initialize用于将默认值设置为的这个技巧- 将db 中列student的默认值设置为.role0

此外,事实证明,您必须添加role到,devise_permitted_parameters以便您可以从设计控制器中更新其值:

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: %i[name role])
  # ...
end

推荐阅读