Rails 3 – Active_admin可以使用现有的用户模型吗?
Active Admin可以使用我目前的Devise用户模型吗? 它已经有一个名为admin
的列,如果是true
,我想跳过/admin
pipe理员login。
这可能吗?
当前路线:
#Active admin ActiveAdmin.routes(self) #Devise devise_for :admin_users, ActiveAdmin::Devise.config devise_for :users, :path => "account"
其余的基本上是标准Devise + Activepipe理员
是的,你可以做到这一点,当运行生成器跳过用户模型创build:
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
并为您的pipe理员提供您的身份validation方法,例如:
# app/controllers/application_controller.rb def authenticate_admin! redirect_to new_user_session_path unless current_user.is_admin? end
重新启动您的服务器,它应该工作。 另外看看Active Admin Configuration
希望这可以帮助。
如前所述,您将需要更新您的config/initializers/active_admin.rb
以反映正确的auth方法。
另外,您还需要更新以下设置:
# 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
当然,你不必更新这些(或者后面提到的方法),只是在其他地方重复使用这些方法,但这似乎是最简单/最干净的方法。 您显然需要使用devisevalidation将每个设置( current_USER
)中的“user”replace为模型的名称。
我也build议您在这里时更新以下设置:
# 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
如果devise config使用的默认HTTP方法设置为:delete
,那么最后一次更改是必需的,除非您更改它,否则它是。 重要的是现在他们已经同步了,因为如果你遵循这些指示,你将使用destroy_user_session_path
这是一个已经由destroy_user_session_path
定义的path。 否则,您会收到一条消息,指出[GET] / users / sign_out路由不存在。
所有其他人所说的话,以及与http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails- activeadmin和-色器件/
如果您已经实现了admin_user模型(即,现在有“用户”和“admin_user”模型),select恢复为具有单一用户模型的选项,则会在信息中添加一些附加位。 。
其他步骤包括
删除devise_for :admin_users, ActiveAdmin::Devise.config
从routes.rb devise_for :admin_users, ActiveAdmin::Devise.config
复制代码从app/admin/admin_user.rb
到app/admin/user.rb
(只使用所需的)删除app/admin/admin_user.rb
(或你会得到AdminUser上的一个未初始化的常量错误 )就像这个人(和我一样)。
如果您已经使用默认设置安装了ActiveAdmin,并且想要使用现有模型上的User.is_admin
字段对用户进行身份validation,并删除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.
要configurationdevise注销通过:get
,添加devise.rb:
config.sign_out_via = :get # And for every occurrence of destroy_user_session_path, remove the option method: delete.
创buildis_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
如果在导轨4中,不要忘记在permit_params中添加is_admin。 在app / admin / user.rb中:
permit_params ....., :is_admin
在控制台中为pipe理员用户添加权限:
u = User.find(42); u.is_admin = true; u.save
请享用