1

最近、ActiveAdmin をv.0.5.1からアップグレードしました。v.0.6.2 に。ジェネレーターを実行して構成をアップグレードし、設定を既存のファイルとマージしました。

rails generate active_admin:install User

ActiveAdmin インターフェイスは機能しているようです。しかし、以前は機能していた仕様を正常に実行できなくなりました。私は受け取るActionController::RoutingError

Failure/Error: visit '/users/sign_out'
ActionController::RoutingError:
  No route matches [GET] "/users/sign_out"

次の仕様は、障害の動作を説明するための例として機能します。

# spec/features/users/active_admin_spec.rb
require 'spec_helper'

describe 'Active Admin' do

  before(:all) do
    I18n.locale = :en
  end

  it "rejects a reqular user" do
    @user = create(:user)

    visit '/users/sign_out'
    visit '/users/sign_in'
    fill_in I18n.t('devise.sessions.new.email'), with: @user.email
    fill_in I18n.t('devise.sessions.new.password'), with: @user.password
    click_button I18n.t('devise.sessions.new.sign_in')

    visit "/admin"
    expect(page).not_to have_content "Dashboard"
    expect(page).to have_content "Unauthorized Access!"
  end

end

...

# config/routes.rb
MyApp::Application.routes.draw do

  namespace :api, defaults: {format: :json} do
    namespace :v1 do
      resources :sessions, only: [:create, :destroy]
      resources :users, only: [:create]
    end
  end

  # Configuration when using ActiveAdmin v.0.5.1
  # devise_for :users, controllers: { sessions: "sessions" }

  config = ActiveAdmin::Devise.config
  config[:controllers][:sessions] = "sessions"
  devise_for :users, config

  ActiveAdmin.routes(self)

  root :to => "home#index"    
end

rake routesこれは、アップグレード前の関連部分です。

           new_user_session GET    /users/sign_in(.:format)               sessions#new
               user_session POST   /users/sign_in(.:format)               sessions#create
       destroy_user_session DELETE /users/sign_out(.:format)              sessions#destroy
              user_password POST   /users/password(.:format)              devise/passwords#create
          new_user_password GET    /users/password/new(.:format)          devise/passwords#new
         edit_user_password GET    /users/password/edit(.:format)         devise/passwords#edit
                            PUT    /users/password(.:format)              devise/passwords#update
   cancel_user_registration GET    /users/cancel(.:format)                devise/registrations#cancel
          user_registration POST   /users(.:format)                       devise/registrations#create
      new_user_registration GET    /users/sign_up(.:format)               devise/registrations#new
     edit_user_registration GET    /users/edit(.:format)                  devise/registrations#edit
                            PUT    /users(.:format)                       devise/registrations#update
                            DELETE /users(.:format)                       devise/registrations#destroy
          user_confirmation POST   /users/confirmation(.:format)          devise/confirmations#create
      new_user_confirmation GET    /users/confirmation/new(.:format)      devise/confirmations#new
                            GET    /users/confirmation(.:format)          devise/confirmations#show
                 admin_root        /admin(.:format)                       admin/dashboard#index
            admin_dashboard        /admin/dashboard(.:format)             admin/dashboard#index
   batch_action_admin_users POST   /admin/users/batch_action(.:format)    admin/users#batch_action
                admin_users GET    /admin/users(.:format)                 admin/users#index
                            POST   /admin/users(.:format)                 admin/users#create
             new_admin_user GET    /admin/users/new(.:format)             admin/users#new
            edit_admin_user GET    /admin/users/:id/edit(.:format)        admin/users#edit
                 admin_user GET    /admin/users/:id(.:format)             admin/users#show
                            PUT    /admin/users/:id(.:format)             admin/users#update
                            DELETE /admin/users/:id(.:format)             admin/users#destroy
batch_action_admin_comments POST   /admin/comments/batch_action(.:format) admin/comments#batch_action
             admin_comments GET    /admin/comments(.:format)              admin/comments#index
                            POST   /admin/comments(.:format)              admin/comments#create
              admin_comment GET    /admin/comments/:id(.:format)          admin/comments#show

rake routesこれは、アップグレード後の関連部分です。

           new_user_session GET        /admin/login(.:format)                 sessions#new
               user_session POST       /admin/login(.:format)                 sessions#create
       destroy_user_session DELETE|GET /admin/logout(.:format)                sessions#destroy
              user_password POST       /admin/password(.:format)              active_admin/devise/passwords#create
          new_user_password GET        /admin/password/new(.:format)          active_admin/devise/passwords#new
         edit_user_password GET        /admin/password/edit(.:format)         active_admin/devise/passwords#edit
                            PUT        /admin/password(.:format)              active_admin/devise/passwords#update
   cancel_user_registration GET        /admin/cancel(.:format)                devise/registrations#cancel
          user_registration POST       /admin(.:format)                       devise/registrations#create
      new_user_registration GET        /admin/sign_up(.:format)               devise/registrations#new
     edit_user_registration GET        /admin/edit(.:format)                  devise/registrations#edit
                            PUT        /admin(.:format)                       devise/registrations#update
                            DELETE     /admin(.:format)                       devise/registrations#destroy
          user_confirmation POST       /admin/confirmation(.:format)          devise/confirmations#create
      new_user_confirmation GET        /admin/confirmation/new(.:format)      devise/confirmations#new
                            GET        /admin/confirmation(.:format)          devise/confirmations#show
                 admin_root            /admin(.:format)                       admin/dashboard#index
            admin_dashboard GET        /admin/dashboard(.:format)             admin/dashboard#index
   batch_action_admin_users POST       /admin/users/batch_action(.:format)    admin/users#batch_action
                admin_users GET        /admin/users(.:format)                 admin/users#index
                            POST       /admin/users(.:format)                 admin/users#create
             new_admin_user GET        /admin/users/new(.:format)             admin/users#new
            edit_admin_user GET        /admin/users/:id/edit(.:format)        admin/users#edit
                 admin_user GET        /admin/users/:id(.:format)             admin/users#show
                            PUT        /admin/users/:id(.:format)             admin/users#update
                            DELETE     /admin/users/:id(.:format)             admin/users#destroy
batch_action_admin_comments POST       /admin/comments/batch_action(.:format) admin/comments#batch_action
             admin_comments GET        /admin/comments(.:format)              admin/comments#index
                            POST       /admin/comments(.:format)              admin/comments#create
              admin_comment GET        /admin/comments/:id(.:format)          admin/comments#show

を無視しているようSessionsControllerです。Devise v.2.2.7
を使用しています。


承認のバグ

この構成により、管理者以外のユーザーが ActiveAdmin にアクセスできることに気付きました。したがって、ここでさらに修正する必要があります。/admin通常のユーザーとしてサインインしたときにアクセスして、試してみてください。

承認のバグが解決されました

ActiveAdmin v.0.6.2 では問題はありませんでした。最初に設定した構成を単純に破棄しました。その時、シングルユーザーモデルで ActiveAdmin と Devise をセットアップする方法に関するチュートリアルに従いました。基本的に、次のパラメーターを誤って置き換えました。

# config/initializers/active_admin.rb
config.authentication_method = :authenticate_active_admin_user!

これとともに:

# config/initializers/active_admin.rb
config.authentication_method = :authenticate_user!

この構成は、 の実行時に生成されますrails generate active_admin:install User


最後に、レジェが正しい構成を提供したことがわかります。すべてが機能しているので(私が知る限り)、あなたの答えを喜んで受け入れます。

4

2 に答える 2

1

問題は、ルートを定義する順序にあります。この質問への回答を確認してください

要するに:routes.rbのdevise_for前に置くresources :users

上にdevise_forを移動した後のルーティングエラーを解決するためのUPD

ActiveAdmin は に使用されるため、命名にはいくつかの競合がありUserます。ブロック

config = ActiveAdmin::Devise.config
config[:controllers][:sessions] = "sessions"
devise_for :users, config

/admin/ スタイルの方法で、標準の device_path_variables を使用して、管理者に関連するすべてを定義します。

new_user_session     GET         /admin/login(.:format)    sessions#new
user_session         POST        /admin/login(.:format)    sessions#create
destroy_user_session DELETE|GET  /admin/logout(.:format)   sessions#destroy

単純なユーザーに関連するすべてをオーバーライドするため、次のようなルートは'/users/sign_out'単に存在しません。

これを修正するには、routes.rb を調整して、plain-user と admin-user の両方のルートを定義する必要があります。

SysAdmin::Application.routes.draw do

  # define plain-user routes    
  devise_for :users, :controllers => { :sessions => "sessions" }

  # define admin-user routes    
  config = ActiveAdmin::Devise.config
  config[:controllers][:sessions] = "sessions"
  config[:as] = 'admin' # override standard_path_variable naming for admins
  devise_for :users, config

  namespace :api, defaults: {format: :json} do
    namespace :v1 do
      resources :sessions, only: [:create, :destroy]
      resources :users, only: [:create]
    end
  end

  root :to => "home#index"
  ActiveAdmin.routes(self)
end
于 2013-10-23T09:23:14.520 に答える