设计中的多个用户

时间:2015-10-14 16:51:55

标签: ruby-on-rails devise

经过2整天,我找不到解决方案。

这是我的问题。

我创建了一个rails应用程序并添加了Devise。这一切都很有效,除了我有3个设计用户:UsersVendorsAdmin

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

你怎么能有3个不同的devise/sessions/new views?我希望User登录并注册与VendorsAdmin登录区别开来。我有3个设计控制器:Users_controller,Vendors_controller和Admins_controller

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

干杯,

2 个答案:

答案 0 :(得分:3)

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

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

然后,您可以使用signup帮助器将每个角色路由到routes.rb devise_for中的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 ,如下所示:

User

BUT:

这不是很干。我强烈建议您重新考虑您的设计并为role创建一个{{1}}属性的单个模型。试试CanCan gem。以下是CanCan关于如何创建基于角色的授权的维基:https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

答案 1 :(得分:2)

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

STI

第一步是整理你的模型。

您提到您希望UsersVendorsAdmin。我假设你为此制作了几个模型,并且现在想要规定从一个模型继承它会更有益。

您需要使用的单个模型应为User,并应通过STI (Single Table Inheritance)推断其功能:

#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. 使用您的路线管理选择&amp;控制器
  2.   
  3. 管理视图中的选择
  4.   

我个人会保留一个控制器并使用不同的视图。您使用相同的数据,因此您只需要完全呈现不同的布局或不同的视图 ......

顺便说一句,请记住Devise uses its own controllers。出于您的目的,这些分别为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

上述路线未经测试。

对于相应的模型使用您自己的控制器是不可取的 - 您每次都必须重新创建它们,使其非常WET。相反,您可以做这样的事情:

#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参数拉到网址,允许您在视图中设置样式。