经过2整天,我找不到解决方案。
这是我的问题。
我创建了一个rails应用程序并添加了Devise。这一切都很有效,除了我有3个设计用户:Users
,Vendors
和Admin
。
我的问题是我正在尝试为每个用户创建单独的登录页面。但是,当我生成设计视图并在登录页面上工作时,它只从views / devise / sessions / new页面中提取HTML。因此,无论您是/admin/sign_up
,/vendor/sign_up
还是/user/sign_up
,都可以从views/devise/sessions/new
获得完全相同的设计页面。
你怎么能有3个不同的devise/sessions/new views
?我希望User
登录并注册与Vendors
和Admin
登录区别开来。我有3个设计控制器:Users_controller,Vendors_controller和Admins_controller
我很困惑。任何帮助将不胜感激。
干杯,
答案 0 :(得分:3)
您可以为Users
,Admins
和Vendors
生成三种不同的设计模型,视图和控制器。您也可以将设计助手添加到现有模型和控制器中。对于视图,请确保使用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
这不是很干。我强烈建议您重新考虑您的设计并为role
创建一个{{1}}属性的单个模型。试试CanCan gem。以下是CanCan关于如何创建基于角色的授权的维基:https://github.com/ryanb/cancan/wiki/Role-Based-Authorization
答案 1 :(得分:2)
好的,有几件事要看这里。
第一步是整理你的模型。
您提到您希望Users
,Vendors
和Admin
。我假设你为此制作了几个模型,并且现在想要规定从一个模型继承它会更有益。
您需要使用的单个模型应为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
这将允许您将每个模型用作完全独立的模型,同时保持额外功能的灵活性。如果你需要,我可以解释一下;最重要的是,你使用它比使用单独的表更好。
接下来我们自己有了观点。
您对观看的选项如下:
- 使用您的路线管理选择&amp;控制器
- 管理视图中的选择
醇>
我个人会保留一个控制器并使用不同的视图。您使用相同的数据,因此您只需要完全呈现不同的布局或不同的视图 ......
顺便说一句,请记住Devise
uses its own controllers。出于您的目的,这些分别为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
上述路线未经测试。
对于相应的模型使用您自己的控制器是不可取的 - 您每次都必须重新创建它们,使其非常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
参数拉到网址,允许您在视图中设置样式。