[英]Multiple Users in Devise
整整2天后,我無法找到解決方案。
這是我的問題。
我創建了一個Rails應用並添加了Devise。 除了我有3個devise用戶之外,其他所有功能都很棒: Users
, Vendors
和Admin
。
我的問題是我試圖為每個用戶創建單獨的登錄頁面。 但是,當我生成設計視圖並在登錄頁面上工作時,它僅從視圖/設計/會話/新頁面中提取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
登錄和注冊看起來與Vendors
和Admin
登錄不同。 我有3個設備控制器:Users_controller,Vendors_controller和Admins_controller
我很困惑。 任何幫助將不勝感激。
干杯,
您可以為Users
, Admins
和Vendors
生成三種不同的設計模型,視圖和控制器。 您也可以改為將設計助手添加到現有模型和控制器中。 對於視圖,請確保使用Devise的角色范圍視圖生成器:
`rails generate devise:views users` # change `users` to whichever role you are generating
然后,您可以使用它們的devise_for
助手將每個角色路由到routes.rb
自己的signup
, routes.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
好的,這里有幾件事要看。
第一步是整理模型。
您提到要擁有“ 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
這樣,您就可以像完全獨立一樣使用每個模型,同時又可以保持額外功能的靈活性。 如果需要的話,我可以進一步解釋。 最重要的是,與單獨使用表格相比,使用它會更好。
接下來我們有自己的看法。
您的視圖選項如下:
- 使用您的路線和控制器管理選擇
- 在視圖本身中管理選擇
我個人將保留一個控制器並使用不同的視圖。 您使用的是相同的數據,因此所需要做的就是渲染不同的布局或完全渲染不同的視圖 ...
而且,順便說一下,請記住Devise
使用其自己的控制器 。 為了您的目的,分別是Sessions
和Registrations
:
#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.