我有三个模型如下:
user.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :role, polymorphic: true
validates_presence_of :first_name, :last_name, :email, :password,
:password_confirmation
end
student.rb
class Student < ActiveRecord::Base
has_one :user, as: :role, dependent: :destroy
accepts_nested_attributes_for :user
end
teacher.rb
class Teacher < ActiveRecord::Base
has_one :user, as: :role, dependent: :destroy
accepts_nested_attributes_for :user
end
我有用户注册和登录按预期工作。但是,我无法弄清楚如何在用户登录时将用户定向到相应的主页。
我按照以下方式处理经过身份验证的用户的路由:
authenticated :user do
root to: "students#home", as: :user_root
end
理想情况下,如果当前用户的role
属性是学生,则将students#home
设置为:user_root
。如果是教师,则会将teachers#home
设置为:user_root
。有没有办法在路线上完全处理这个问题?
答案 0 :(得分:1)
他们的结构让我感到困惑。老师和学生有多少共同点?学生和老师不会需要不同的协会,领域和一切吗?
为什么不将具有不同设计范围的学生和教师模型完全分开?请参阅设计多个模型的设计维基:https://github.com/plataformatec/devise#configuring-multiple-models
对于共享功能,您既可以从抽象模型继承,也可以使用关注/模块来实现共享功能。
module DeviseConcern
extend ActiveSupport::Concern
included do
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates_presence_of :first_name, :last_name, :email, :password,
:password_confirmation
end
end
答案 1 :(得分:1)
在使用AJcodez的解决方案时,一些诸如用户身份验证之类的东西实现起来并不乐观。我最终选择了原来的实施。
关于路线的一个鲜为人知的事情是它们可以有lambas。我们的路线最终看起来如下:
authenticated :user, lambda { |u| u.role_type == "Student" } do
root to: "students#home", as: :student_root
end
authenticated :user, lambda { |u| u.role_type == "Teacher" } do
root to: "teachers#home", as: :teacher_root
end