【问题标题】:While Signout the application in ROR, I got the error在 ROR 中注销应用程序时,出现错误
【发布时间】:2018-02-16 08:03:36
【问题描述】:

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

我的 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

这是我的错误:

未知操作找不到路径“/sign_out”的设计映射。 这可能有两个原因:1)你忘了包装你的路线 在范围块内。例如: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) 你正在测试一个 设计绕过路由器的控制器。如果是这样,你可以明确告诉 设计要使用的映射:@request.env["devise.mapping"] = Devise.mappings[:user]

【问题讨论】:

    标签: ruby-on-rails


    【解决方案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
    

    【讨论】:

    • 如果我将get 替换为delete,则会出现路由错误
    • 没有路线匹配 [GET] "/sign_out"
    • &lt;a href="/sign_out" class="btn btn-default btn-flat"&gt;Sign out&lt;/a&gt; localhost:3000/sign_out
    • 退出用你的链接替换跨度>
    • 谢谢 Mayur Shah 先生。我得到解决我的错误。非常感谢。
    【解决方案2】:

    如果您想通过 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 配置选项,则上述注销操作可能会导致错误。您可以通过指定复制默认行为(从删除更改为获取基于 :sign_out_via):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多