经过身份验证的多态属性的动态根

时间:2013-12-18 04:08:02

标签: ruby-on-rails devise routing

我有三个模型如下:

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。有没有办法在路线上完全处理这个问题?

2 个答案:

答案 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