[英]RoutingError after upgrading ActiveAdmin to v.0.6.2
我最近升級ActiveAdmin從v.0.5.1。 至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.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
時,將生成此配置。
最后,我可以說Leger提供了正確的配置 。 由於現在一切正常(據我所知),我很高興接受您的回答。
問題出在定義路由的順序上。 查看此問題的答案
總之:把devise_for
之前resources :users
在routes.rb中
在將devise_for移至頂部后,UPD解決了路由錯誤
命名中存在一些沖突,因為ActiveAdmin用於User
。 塊
config = ActiveAdmin::Devise.config
config[:controllers][:sessions] = "sessions"
devise_for :users, config
使用/ admin /風格的標准devise_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'
類'/users/sign_out'
路由。
要解決此問題,您需要為普通用戶和管理員用戶定義路由,並調整route.rb:
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
將它們添加到您的路由文件中
devise_scope :admin_user do
post '/admin/logout', :to => 'active_admin/devise/sessions#destroy'
end
希望這會工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.