簡體   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