所以我一直在咀嚼这个问题几天,并且无法提出一个雄辩的解决方案。网上有一些资源,但它们不是很全面。 这是我的情况:
功能
目前,我在Devise中设置了User类,以及User和Admin,Manager,Client之间的多态关系。我尝试使用单个表继承,但由于每个用户类型具有不同的属性,我想避免使用具有许多空值的大型单个表。
提议的解决方案
多态关系。用户模型,具有管理员,经理和客户端 继承。这里的问题是如何限制每个模型 他们各自的控制员?
用户模型,具有has_one关系 使用ClientProfile和ManagerProfile来处理额外的事务 属性。然后使用declarative_authorization或CanCanCan 限制授权。这有助于保持应用程序DRY仅保留 一个用户模型,但视图逻辑变得复杂。
在这两个解决方案中,哪一个看起来更具可扩展性,清洁和安全?如果对于通用应用程序架构有任何其他建议会更好吗?谢谢!
答案 0 :(得分:0)
这就是我在ROR
上设置多个用户类型的应用程序的方法#config/routes.rb
AppName::Application.routes.draw do
devise_for :users, :controllers => {
registrations: 'users/registrations',
:sessions => "users/sessions",
:passwords => 'users/passwords',
:confirmations => 'users/confirmations'
}
authenticate :user do
namespace :users do
....
get '/' => 'dashboards#index'
root :to => 'dashboards#index'
end
end
devise_for :admins, :controllers => {
:sessions => "admins/sessions",
:passwords => 'admins/passwords',
:confirmations => 'admins/confirmations'
}
authenticate :admin do
namespace :admins do
....
get '/dashboard' => 'dashboards#index
root :to => 'dashboards#index'
end
end
root 'pages#index'
end
现在您已准备好路线,您可以创建控制器
我有
#app/controllers/user_controller.rb
class UserController < ApplicationController
before_filter :authenticate_user!
layout 'users/default'
before_filter :check_user_active
private
def check_user_active
unless current_user.active
flash[:notice]= t(:user_not_active)
sign_out current_user
redirect_to new_user_session_path
end
end
end
# app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
layout 'users/login'
def create
end
def destroy
end
end
最后但并非最不重要的是观点
将所有内容放在名称空间中,如#app/views/users/sessions/new.html.haml