【问题标题】:Devise/Rails: No route matches [GET] "/users/sign_out"设计/Rails:没有路线匹配[GET]“/users/sign_out”
【发布时间】:2012-03-06 19:36:42
【问题描述】:

我对设计如何路由我的请求感到有些困惑,由于某种原因,我现在无法进入我的应用程序中的注销路径:

ActionController::RoutingError (No route matches [GET] "/users/sign_out")

以下是与我的用户模型和设计相关的路线:

devise_for :users, :controllers => {:registrations => "registrations"}
devise_scope :user do
  get '/settings' => 'registrations#edit'
end

定义该范围是否会阻止我的其他路由也正常工作?

更新

我不认为它应该是 GET 请求,因为我的链接看起来像:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

【问题讨论】:

  • 应该是DELETE请求。如果你只在你的路线中留下 devise_for :users 会发生什么?
  • 您的 javascript 是否抛出任何错误?实际上是不显眼的 javascript 将使它成为一个 DELETE http 调用。
  • 您的 Devise 配置文件对以下项目有什么作用:config.sign_out_via
  • @jesse 你是对的,我需要包含jquery-ujs 才能工作。

标签: ruby-on-rails devise


【解决方案1】:

如果您尝试通过在浏览器的地址栏中键入 /users/sign_out 或正常链接到它,您将收到此错误。在这里总结一些 cmets 和答案以及 github 上设计 repo 中的问题:

这是预期的功能,RESTful 应用不应使用 GET 请求修改状态。

您可以通过使用@Trip、@fuzzyalej 提到的 DELETE 方法和 @Joseph Silvashy 的更新的链接来解决此问题。

或者,(不太推荐),在 /config/initializers/devise.rb 中,您可以进行以下更改

config.sign_out_via = :delete

到

config.sign_out_via = :get

我在关注http://railscasts.com/episodes/209-introducing-devise 时遇到了这个问题,而他在那里使用的是旧版本的设计,这不是问题。

【讨论】:

  • 对我来说,application.js 只是缺少(来自 railswizard.com 的 rails 4 模板)并且需要以下行://= jquery //= jquery_ujs
【解决方案2】:

所以这篇文章有一个答案:

这必须与delete 方法一起发送,这样它就不会默认为get

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

【讨论】:

    【解决方案3】:

    使用正确的 HTTP 方法保留您的 devise.rb:

    # good 
    config.sign_out_via = :delete
    
    # bad
    config.sign_out_via = :get
    

    使用button_to 代替link_to

    # good 
    = button_to "Sign Out", destroy_user_session_path, method: :delete
    
    # bad
    = link_to "Sign Out", destroy_user_session_path, method: :delete"
    

    如果您使用的是引导程序(保持优雅)

    = link_to "Sign Out", destroy_user_session_path, method: :delete, class: "btn btn-default btn-sm"
    

    【讨论】:

    【解决方案4】:

    如果您将 SSL 与 Devise 控制器一起使用,并尝试从“http”url 中注销,则发生的情况是将 DELETE 请求发送到 #destroy 方法,然后通过 GET 重定向到 https 版本。您可以通过将 https 添加到退出链接来解决此问题,如下所示:

    = link_to "Sign out", destroy_user_session_url(protocol: 'https'), method: :delete
    

    注意:必须是 'url' 而不是 'path'

    【讨论】:

    • 更改后:安全连接失败! (错误代码:ssl_error_rx_record_too_long)
    【解决方案5】:
    devise_for :users
    devise_scope :user do
      get '/users/sign_out' => 'devise/sessions#destroy'
    end
    

    在您的 routes.rb 中。

    【讨论】:

    • 这对我有帮助,谢谢!
    【解决方案6】:

    来自rails documentation:

    link_to("Destroy", "http://www.example.com", :method => :delete, :confirm => "Are you sure?")
    # => <a href='http://www.example.com' rel="nofollow" data-method="delete" data-confirm="Are you sure?">Destroy</a>
    

    【讨论】:

      【解决方案7】:

      我遇到了同样的问题,为了解决它,我采取了以下步骤: 1) 在 assets/javascripts/application.js 中包含 //= require jquery_ujs 2) 将 gem 'jquery-rails' 添加到我的 gemfile 3) 捆绑安装

      ...它成功了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 2014-01-29
        • 2017-08-03
        • 2015-12-09
        • 2011-09-27
        • 2012-01-30
        • 2018-03-04
        相关资源
        最近更新 更多