在ROR中注销应用程序时,我收到了错误

时间:2018-02-16 08:03:36

标签: ruby-on-rails

我在退出申请时收到以下错误消息。只有在我的应用程序中添加导入概念后才会发现此错误。

我的routes.rb文件:

Rails.application.routes.draw do
  devise_for :users
  resources :userdetails do
    collection {post :import}
  end
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
root to: "userdetails#index"

devise_scope :users do
 get 'sign_in', to: 'devise/sessions#new'
 get 'sign_out', to: 'devise/sessions#destroy' 
end
end

控制器文件:

class UserdetailsController < ApplicationController
  # before_action :set_userdetail, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
  # GET /userdetails
  # GET /userdetails.json
def import
    Userdetail.import(params[:file])
    redirect_to root_url, notice: "Data imported"
  end

路线:

      Prefix Verb   URI Pattern                     Controller#Action
    new_user_session GET    /users/sign_in(.:format)        devise/sessions#new
        user_session POST   /users/sign_in(.:format)        devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)       devise/sessions#destroy

这是我的错误:

  

未知操作无法找到路径&#34; / sign_out&#34;的设计映射。   这可能有两个原因:1)你忘了包裹你的路线   在范围块内。例如:devise_scope:user do get   &#34; /一些/路由&#34; =&GT; &#34; some_devise_controller&#34;结束2)你正在测试一个   设计控制器绕过路由器。如果是这样,你可以明确告诉   设计要使用的映射:@ request.env [&#34; devise.mapping&#34;] =   Devise.mappings [:用户]

2 个答案:

答案 0 :(得分:1)

尝试将get 'sign_out', to: 'devise/sessions#destroy'替换为delete 'sign_out', to: 'devise/sessions#destroy'

Rails.application.routes.draw do
  devise_for :users
  resources :userdetails do
    collection {post :import}
  end
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
root to: "userdetails#index"

devise_scope :users do
 get 'sign_in', to: 'devise/sessions#new'
 delete 'sign_out', to: 'devise/sessions#destroy' 
end
end

答案 1 :(得分:0)

如果您想通过GET方法注销,只需在/config/initializers/devise.rb

中替换以下内容即可
config.sign_out_via = :delete

config.sign_out_via = :get

它应该有效。无需在生成的/sign_out链接HTML标记中手动进行任何更改。

有关详细信息,我建议您浏览初始化程序文件以了解所使用的默认值。

你也可以参考这个Devise wiki页面How To: Change the default sign_in and sign_out routes,其中提到了这个配置选项(以下引用以便快速查看)

  

请注意,如果您正在使用:sign_out_via配置选项,则上面的注销操作可能会导致错误。您可以通过指定:

复制默认行为(基于以下内容从delete更改为:sign_out_via)