ruby-on-rails - 登录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
解决方案
你的方法真的很糟糕,删除它们ApplicationController#teacher?
并ApplicationController#student?
使用内置的User#teacher?
或User#student?
代替:
<% if current_user.teacher? %>
顺便说一句,您也不需要after_initialize
用于将默认值设置为的这个技巧- 将db 中列student
的默认值设置为.role
0
此外,事实证明,您必须添加role
到,devise_permitted_parameters
以便您可以从设计控制器中更新其值:
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: %i[name role])
# ...
end
推荐阅读
- python - 为什么 sympy Sum 函数不能计算这个总和?
- python - Windows 10 的 ADAFFRUIT_PCA9865 库问题
- python - 当 Tkinter 需要无限次读取文件时,它只在循环中读取一次文件
- python - 如何在 Python 和 Postgres 的文本列中搜索一系列整数
- ffmpeg - 如何使用 ffmpeg 和 gstremer 获得相同的结果(通过控制台流式传输 mpeg-ts)
- handlebars.js - 车把部分不显示在物化卡中?
- python - 跨应用程序中的多个子进程共享 PyJulia 实例
- stream - java流管道创建列表映射
- c# - 如何在 C# 中将类名转换为 T?
- python - 如何使用 tf.random.uniform 并且不生成重复项