- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 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'
<小时/>
要求...
其他信息。
为了满足这些要求,我考虑了多种选择,包括 STI、多态关联、授权 gem 以及单独的模型和表。
多态关联是一个糟糕的选择,因为角色之间的字段是相同的,并且可能会导致用户创建困难。像 cancan 这样的授权 gem 不是一个选择,因为角色与其他模型类有不同的关系。如果我使用 cancan,用户模型将被不适用于所有用户的关系所污染。拥有单独的模型和表格将无法为所有类型的用户提供单一入口点。
STI 似乎很合适,因为所有角色字段都相同,因此数据库将被标准化。可以轻松添加其他用户。
从纯粹主义者的角度来看,这是有道理的。我的不同角色都是用户,用户是所有其他专业的接口(interface)或契约(Contract)。
最佳答案
根据您提供的有关用户的要求和信息,STI 似乎是一个很好的解决方案,特别是如果每个用户都有不同的逻辑。然而,即使每个角色没有任何其他数据库信息,多态关联也可以正常工作(请参阅 http://railscasts.com/episodes/394-sti-and-polymorphic-associations )。
如果我错了,请纠正我,但 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/
我已将 Devise 设置为允许使用电子邮件或用户名登录。使用您的用户名,您可以拥有一个个性网址,如下所示:vanity.com/username。因此,我的用户模型具有 attr_accessibl
我有个类似的问题。我正在使用sendmail选项,并继续出现错误 “发送邮件需要使用SMTP发件人地址。设置邮件 smtp_envelope_from,return_path,发件人或地址。” 我已经
我在为我的用户表做种子时遇到问题。 (rails 3.2.6,jruby 1.6.7.2,devise 2.1.2) 这是一个非常通用的用户表,由“rails generate devise User
我为公司设计了一个设计。我做了一个表用户,希望我想存储用户信息密码等。当用户注册时,我希望它创建一个新用户和公司的关联。 我的公司模型:has_one:用户我的用户模型:Belongs_to: 公司
我目前正在从我们的应用程序中删除 IP 日志记录,我想知道使用 Devise 执行此操作的最佳方法是什么? 最佳答案 你的答案看起来不错,但如果你只想跟踪特定用户的 IP,一个(不那么冗长但可能更令人
我有一个包含 Devise (2.2.3) 和 Active Admin (0.5.1) 的应用程序,我先安装了 Devise,然后安装了 Active Admin。整个应用程序需要登录,所以在我的应
我有一个包含 Devise (2.2.3) 和 Active Admin (0.5.1) 的应用程序,我先安装了 Devise,然后安装了 Active Admin。整个应用程序需要登录,所以在我的应
我在 API 模式下使用 Rails,使用 Devise 和 Devise JWT(用于 API)和 ActiveAdmin。我一切正常,但我一直在构建 API Controller ,现在 Acti
在使用 Devise TestHelpers 的文档中,它声明使用诸如... @request.env["devise.mapping"] = Devise.mappings[:admin] 或者 @
许多程序员使用 devise 作为他们的身份验证解决方案,我想听听他们的建议: Devise 已经过测试,但我想知道是否有我自己要测试的东西(集成/单元/功能测试?),以根据我的知识进行标准设计集成(
我正在尝试通过 JSON 注册设备用户,但一直收到 ActiveModel::ForbiddenAttributesError class Api::V1::RegistrationsControll
我正在使用 Rails 4.0.2 和 Devise 3.2.2 来处理用户注册/身份验证。 我已经用谷歌搜索并在 stackoverflow 上搜索答案,但找不到可以回答我的问题的东西。 下面的代码
我正在使用 ruby 2.2.3 和 rails 4.2.5。我无法在我的项目上运行 rails generate devise:install。 Bundler 抛出错误。错误如下 rails
我正在使用设计和 devise-basecamper用于使用我的基于子域的 Web 应用程序进行身份验证。 我想允许 super 用户访问任何帐户(基本上是任何子域)。 我不确定我将如何实现这一点,以
我正在为我的应用程序实现设计邮件程序,我已完成以下步骤: 在模型中: class User "smtp.gmail.com", :port => 587, :domain =
我在 SO 上找到了类似的线程,但没有一个帮助我解决了这个问题。我的路线如下: devise_for :users do post '/users' => 'registrations#cre
编辑 2:看起来对我来说一个快速的临时修复是在我的 link_to_unless_current 和 current_page 方法中的 Controller 名称前面添加一个正斜杠“/”。例如 '
由于无法控制的原因,我无法在当前项目中使用RSpec进行测试。我正在尝试测试“设计重置密码”,但似乎无法提出有用的建议。 这是我到目前为止的内容: require 'test_helper' clas
我有一个问题,一开始看起来并不难,但实际上我无法解决。我正在尝试将 Refinery 用作应用程序的 CMS。我想将 Refinery 用户和其他类型的用户分开,称他们为 mktgeistusers,
我想自定义以下由devise提供的flash msg 在 devise.en.yml 文件中: devise: failure: unconfirmed: 'You have to
我是一名优秀的程序员,十分优秀!