2013-10-23 45 views
1

我最近从v.0.5.1升级了ActiveAdmin。到v.0.6.2。我运行生成器来升级我的配置并将设置与现有文件合并。将ActiveAdmin升级到v.0.6.2后的RoutingError

rails generate active_admin:install User 

ActiveAdmin接口似乎正在工作。但是我不能再成功运行以前工作过的规格。我收到一个ActionController::RoutingError

Failure/Error: visit '/users/sign_out' 
ActionController::RoutingError: 
    No route matches [GET] "https://stackoverflow.com/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从未出现过问题。我只是简单地破坏了我原来设置的配置。那时我按照how to set up ActiveAdmin and Devise with a single user model的教程。运行rails generate active_admin:install User当产生

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

这种配置:基本上,我意外地取代了下列参数:

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

与此有关。


最后,我可以告诉大家,Leger has served the correct configuration。我很高兴接受你的回答,因为现在一切正在发挥作用(据我所知)。

回答

1

问题出在您定义路线的顺序上。退房this question

的答案总之:把devise_for之前resources :users在路线。RB

UPD解决在上面

移动devise_for有在namings一些冲突,因为ActiveAdmin用于User后路由错误。块

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

定义有关的一切管理员在/管理/ -style路标准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'路线根本不存在。

要解决它,你需要定义为普通用户和管理员用户两种途径,调整的routes.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 
+0

当我更改订单时收到相同的错误。 – JJD

+1

关于限制访问非管理员,请查看http://stackoverflow.com/questions/9415884/how-to-limit-acces-to-active-admin-to-admin-users希望它有帮助 – Leger

0

添加这些到你的路由文件

devise_scope :admin_user do 
    post '/admin/logout', :to => 'active_admin/devise/sessions#destroy' 
end 

希望这将工作

相关问题