Rails 3 - Active_admin 可以使用现有的用户模型吗?
Posted
技术标签:
【中文标题】Rails 3 - Active_admin 可以使用现有的用户模型吗?【英文标题】:Rails 3 - Can Active_admin use an existing user model? 【发布时间】:2012-01-11 17:53:42 【问题描述】:Active Admin 可以使用我当前的Devise 用户模型吗?它已经有一个名为admin
的列,如果是true
,我想在转到/admin
时绕过活动管理员登录。
这可能吗?
当前路线:
#Active admin
ActiveAdmin.routes(self)
#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"
其余的基本都是标准的 Devise + Active admin
【问题讨论】:
【参考方案1】:是的,当running the generator 跳过用户模型创建时,您可以这样做:
rails generate active_admin:install --skip-users
然后在你的config/initializers/active_admin.rb
:
# == User Authentication
#
# Active Admin will automatically call an authentication
# method in a before filter of all controller actions to
# ensure that there is a currently logged in admin user.
#
# This setting changes the method which Active Admin calls
# within the controller.
config.authentication_method = :authenticate_admin!
取消注释config.authentication_method
并为您的管理员提供您的身份验证方法,例如:
# app/controllers/application_controller.rb
def authenticate_admin!
redirect_to new_user_session_path unless current_user.is_admin?
end
重启你的服务器,它应该可以工作了。另外看看Active Admin Configuration
希望这会有所帮助。
【讨论】:
您将authenticate_admin 放在哪里!方法?我已经尝试过应用程序控制器,但我得到:未定义的方法`authenticate_admin_user!对于#<:dashboardcontroller:0x007fc3a23bce38> 你可以把它放在 config/initializers/active_admin.rb 文件中。 或者在应用控制器中。【参考方案2】:如前所述,您需要更新您的 config/initializers/active_admin.rb
以反映正确的身份验证方法。
此外,您还需要更新以下设置:
# This setting changes the method which Active Admin calls
# to return the currently logged in user.
config.current_user_method = :current_admin_user
到
config.current_user_method = :current_user
和
# This setting changes the path where the link points to. If it's
# a string, the strings is used as the path. If it's a Symbol, we
# will call the method to return the path.
#
# Default:
config.logout_link_path = :destroy_admin_user_session_path
到
config.logout_link_path = :destroy_user_session_path
当然,您不必更新这些(或帖子中提到的方法),只需覆盖其他地方的方法,但这似乎是最简单/最干净的方法。您显然需要使用设计身份验证将每个设置 (current_USER
) 中的“用户”替换为模型的名称。
我还建议您在其中更新以下设置:
# This setting changes the http method used when rendering the
# link. For example :get, :delete, :put, etc..
#
# Default:
config.logout_link_method = :get
到
config.logout_link_method = :delete
如果您的设计配置使用的默认 HTTP 方法设置为 :delete
,则需要最后一次更改,除非您更改它。重要的是它们现在已同步,因为如果您按照这些说明进行操作,您将使用 destroy_user_session_path
,这是设计已定义的路径。否则,您将收到一条消息,指出 [GET] /users/sign_out 路由不存在。
【讨论】:
如果您不使用 current_user 更新 current_user_method,您可能会看到“评论未保存,文本为空”的闪烁。关于 ActiveAdmin 评论创建,至于current implementation provides only empty_text error in case of a failure。【参考方案3】:所有其他人所说的以及与指南相结合的内容 http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/
如果您在已经实现 admin_user 模型(即现在您有一个 'user' 和一个 'admin_user ' 模型)。
包含的额外步骤
从 routes.rb 中删除 devise_for :admin_users, ActiveAdmin::Devise.config
将代码从app/admin/admin_user.rb
复制到app/admin/user.rb
(只使用需要的)
删除app/admin/admin_user.rb
(或者你会得到一个Uninitialized constant error on AdminUser),就像这个人(还有我)一样。
【讨论】:
【参考方案4】:如果您已经使用默认设置安装了 ActiveAdmin,并且您想在现有模型上使用 User.is_admin
字段对用户进行身份验证,并删除 admin_user 表,则流程如下:
回滚 admin_user 迁移(如果您在安装 Active Admin 时没有使用 --skip-users
):
rake db:migrate:down VERSION=20141205110842 # create_active_admin_comments.rb
rake db:migrate:down VERSION=20141205110831 # add_devise_to_admin_users.rb
rake db:migrate:down VERSION=20141205110820 # devise_create_admin_users.rb
然后删除这 3 个文件。
在路由中,去掉devise_for :admin_users, ActiveAdmin::Devise.config
这一行
在application_controller.rb中,添加:
def authenticate_admin!
if current_user && current_user.is_admin
# fine
else
redirect_to new_user_session_path
end
end
在active_admin.rb中:
config.authentication_method = :authenticate_admin!
config.current_user_method = :current_user
config.logout_link_path = :destroy_user_session_path
config.allow_comments = false
config.logout_link_method = :get # couldn't get active_admin to sign out via :delete. So I configure devise to sign out via :get.
要将 devise 配置为通过 :get
退出,请添加 devise.rb:
config.sign_out_via = :get
# And for every occurrence of destroy_user_session_path, remove the option method: delete.
创建 is_admin 迁移:
rails g migration add_is_admin_to_user is_admin:boolean
像这样编辑迁移:
class AddIsAdminToUser < ActiveRecord::Migration
def change
add_column :users, :is_admin, :boolean, default: false
end
end
然后迁移:
rake db:migrate
如果在 rails 4 中,不要忘记在 permit_params 中添加 is_admin。在 app/admin/user.rb 中:
permit_params ....., :is_admin
在控制台中为管理员用户添加权限:
u = User.find(42); u.is_admin = true; u.save
享受
【讨论】:
以上是关于Rails 3 - Active_admin 可以使用现有的用户模型吗?的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3. 如何添加 ActiveAdmin 将使用的助手?
PostsController #index中的NameError
React on Rails 可以集成到现有的 Rails 3.x 应用程序中吗?