繁体   English   中英

设计中的多个用户

[英]Multiple Users in Devise

整整2天后,我无法找到解决方案。

这是我的问题。

我创建了一个Rails应用并添加了Devise。 除了我有3个devise用户之外,其他所有功能都很棒: UsersVendorsAdmin

我的问题是我试图为每个用户创建单独的登录页面。 但是,当我生成设计视图并在登录页面上工作时,它仅从视图/设计/会话/新页面中提取HTML。 因此,无论您进入/admin/sign_up/vendor/sign_up还是/user/sign_up您都可以从views/devise/sessions/new /user/sign_up views/devise/sessions/new获得完全相同的/user/sign_up页面。

您如何拥有3种不同的devise/sessions/new views 我希望User登录和注册看起来与VendorsAdmin登录不同。 我有3个设备控制器:Users_controller,Vendors_controller和Admins_controller

我很困惑。 任何帮助将不胜感激。

干杯,

您可以为UsersAdminsVendors生成三种不同的设计模型,视图和控制器。 您也可以改为将设计助手添加到现有模型和控制器中。 对于视图,请确保使用Devise的角色范围视图生成器:

`rails generate devise:views users` # change `users` to whichever role you are generating

然后,您可以使用它们的devise_for助手将每个角色路由到routes.rb自己的signuproutes.rb所示:

devise_scope :user do 
  get 'users/login'   to: 'users#sessions#new',  as 'user_login'
end

devise_scope :admin do 
  get 'admins/login',  to: 'admins#sessions#new', as 'admin_login'
end

devise_scope :vendor do
  get 'vendors/login', to: 'vendors#sessions#new', as 'vendor_login'
end

但:

这不是很干。 我强烈建议重新考虑您的设计并为具有role属性的User创建一个模型。 尝试CanCan宝石 这是CanCan关于如何创建基于角色的授权的Wiki: https : //github.com/ryanb/cancan/wiki/Role-Based-Authorization

好的,这里有几件事要看。


STI

第一步是整理模型。

您提到要拥有“ Users ,“ Vendors和“ Admin 我想您已经为此创建了多个模型,并且现在要规定,从一个模型继承将对您更加有利。

您需要使用的单个模型应该是User ,并且应该通过STI(单表继承)推断其功能:

#app/models/user.rb
class User < ActiveRecord::Base
   #columns id | type | devise | attributes | created_at | updated_at
end

#app/models/admin.rb
class Admin < User
   #No table necessary
end

#app/models/vendor.rb
class Vendor < User
   #No table necessary
end

这样,您就可以像完全独立一样使用每个模型,同时又可以保持额外功能的灵活性。 如果需要的话,我可以进一步解释。 最重要的是,与单独使用表格相比,使用它会更好。


查看

接下来我们有自己的看法。

您的视图选项如下:

  1. 使用您的路线和控制器管理选择
  2. 在视图本身中管理选择

我个人将保留一个控制器并使用不同的视图。 您使用的是相同的数据,因此所需要做的就是渲染不同的布局或完全渲染不同的视图 ...

而且,顺便说一下,请记住Devise 使用其自己的控制器 为了您的目的,分别是SessionsRegistrations

#config/routes.rb
def devise_path_names
    { sign_in: "login", sign_up: "", registration: "register", sign_out: "logout" }
end

devise_for :users,  path_names: devise_path_names #-> url.com/users/login
devise_for :admins, controllers: { sessions: "devise#sessions", registrations: "devise#registrations" }, path_names: devise_path_names #-> url.com/admins/login
devise_for :vendors, controllers: { sessions: "devise#sessions", registrations: "devise#registrations" }, path_names: devise_path_names #-> url.com/vendors/login

以上路线未经测试。

建议不要将自己的控制器用于相应的模型-您每次都必须重新创建它们,使其非常湿润 相反,您将可以执行以下操作:

#app/controllers/devise/sessions_controller.rb
class SessionsController < Devise::SessionsController
   before_action :set_route

   private

   def set_route
      @route = request.path.split('/')[0]
   end
end

这会将您需要的参数传递给devise#sessions控制器。

话虽如此,您甚至可以在视图本身中使用CSS类更改样式:

$ rails generate devise:views users

#app/views/devise/sessions/new.html.erb
<%= form_for resource, as: resource_name, url: session_path(resource_name), class: @route do |f| %>
  ...

这将允许您根据CSS的样式设置表单的样式。 它将通过网址拉出@route参数,从而允许您在视图中设置样式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM