gpt4 book ai didi

ruby-on-rails - 在 Devise 注册后登录继承的用户

转载 作者:行者123 更新时间:2023-12-03 01:16:18 25 4
gpt4 key购买 nike

我使用的是 Rails 3.2.14 和 devise 3.2.1,并且我有一个与我的设备“用户”模型具有 STI 关系的“管理员”。

当我使用下面的表单注册新管理员时,出现以下错误:

undefined method `new_admin_session_path' for #<ActionDispatch::Routing::RoutesProxy:0x007fa6fe068f18>

因为我有:

devise_for :users, :skip => :registrations do

在我的 route 。

如何注册新的“管理员”,然后将其作为“用户”登录?

请注意,如果我在 form_for 中将“Admin”交换为“User”,并从路由中的“User”中删除跳过注册,那么我会得到我想要的行为,除了它是“User”而不是“管理员”。

我创建了一个独立的应用程序来演示我的问题。 https://github.com/deathwishdave/devise_test

用户.rb

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

attr_accessible :email, :password, :password_confirmation, :remember_me
end

admin.rb

class Admin < User
end

index.html.erb

<h2>Sign up</h2>

<%= form_for(Admin.new, :as => :admin, :url => registration_path(:admin)) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.label :password %><br />
<%= f.password_field :password %></div>

<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Sign up" %></div>
<% end %>

路线.rb

  devise_for :users, :skip => :registrations do
delete '/logout', :to => 'sessions#destroy', :as => :destroy_user_session
get '/login', :to => 'sessions#new', :as => :new_user_session
post '/login', :to => 'sessions#create', :as => :user_session
end

devise_for :admins, :skip => :sessions

authenticated :user do
root :to => "dashboard#index"
end

authenticated :admin do
root :to => "dashboard#index"
end

root :to => 'welcome#index'
<小时/>

更新

要求...

  1. 四种不同的用户角色。
  2. 将来能够轻松添加其他角色。
  3. 适用于所有角色的单一登录/登录表单。

其他信息。

  1. 所有当前和 future 的角色共享相同的状态(具有相同的数据库字段)
  2. 每个角色与其他模型类都有不同的关系。

为了满足这些要求,我考虑了多种选择,包括 STI、多态关联、授权 gem 以及单独的模型和表。

多态关联是一个糟糕的选择,因为角色之间的字段是相同的,并且可能会导致用户创建困难。像 cancan 这样的授权 gem 不是一个选择,因为角色与其他模型类有不同的关系。如果我使用 cancan,用户模型将被不适用于所有用户的关系所污染。拥有单独的模型和表格将无法为所有类型的用户提供单一入口点。

STI 似乎很合适,因为所有角色字段都相同,因此数据库将被标准化。可以轻松添加其他用户。

从纯粹主义者的角度来看,这是有道理的。我的不同角色都是用户,用户是所有其他专业的接口(interface)或契约(Contract)。

最佳答案

STI 与多态

根据您提供的有关用户的要求和信息,STI 似乎是一个很好的解决方案,特别是如果每​​个用户都有不同的逻辑。然而,即使每个角色没有任何其他数据库信息,多态关联也可以正常工作(请参阅 http://railscasts.com/episodes/394-sti-and-polymorphic-associations )。

关于 CanCan 的注意事项

如果我错了,请纠正我,但 CanCan 似乎仍然是一个很好的解决方案,也适用于 STI。 CanCan 基于角色,因此您可以检查您正在授权的用户类型,然后根据该用户类型/角色创建规则(带有关系)。

以用户身份登录管理员

要回答您有关如何以用户身份登录管理员的实际问题,您是否应该能够简单地覆盖方法 sign_up in registration controller ,像这样:

class Admin::RegistrationsController < Devise::RegistrationsController
def sign_up(resource_name, resource)
sign_in(:user, resource)
end
end

并将以下内容添加到您的 route :

devise_for :admins, :skip => :sessions, :controllers => { :registrations => "admins/registrations" }

我还找到了有关 STI 和设计的链接,它的情况与您的情况略有不同,但仍然对您有一些有用的提示:http://adamrobbie.me/blog/2013-3-29-sti-with-rails-40-beta-and-devise

关于ruby-on-rails - 在 Devise 注册后登录继承的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com