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 应用程序中吗?

Rails 3:可以用连接表订购吗?

是否可以将 gem mysql2 与 rails 2.3 一起使用?

Rails 3 - 嵌套资源和多态路径:可以到两个级别,但在三个级别中断