Rails 3 - Active_admin可以使用现有的用户模型吗?

时间:2011-12-02 18:18:57

标签: ruby-on-rails-3 devise activeadmin

Active Admin 可以使用我当前的设计用户模型吗?它已经有一个名为admin的列,如果它是true,我想在转到/admin时绕过Active管理员登录。

这可能吗?

目前路线:

#Active admin
ActiveAdmin.routes(self)

#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"

其余基本上是标准的Devise + Active admin

4 个答案:

答案 0 :(得分:70)

是的,当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

希望这有帮助。

答案 1 :(得分:26)

如前所述,您需要更新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)中的“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路由不存在。

答案 2 :(得分:4)

所有其他人所说的以及与指南一起提出的所有内容 http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/

如果您在已经实现admin_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)就像这个人(以及我一样)。

答案 3 :(得分: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.

要配置设计以通过: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

享受