我在退出申请时收到以下错误消息。只有在我的应用程序中添加导入概念后才会发现此错误。
我的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 [:用户]
答案 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)