首页 文章

没有路由匹配“/ users / sign_out”设计rails 3

提问于
浏览
381

我在我的应用程序上安装了devise并在我的 application.html.erb 文件中应用了以下内容:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

我跑了 rake routes 并确认所有路线都有效 .

另外,在我的 routes.rb 文件中,我有 devise_for :usersroot :to => "home#index" .

单击“注销”链接时出现以下路由错误:

No route matches "/users/sign_out"

是什么导致错误?

29 回答

  • 0

    不要忘记在application.js中包含以下行(Rails 3)

    //= require_self
    //= require jquery
    //= require jquery_ujs
    

    jquery_ujs 包含到我的rails应用程序中,它现在可以正常工作 .

  • 5

    这意味着在安装jquery-rails gem之后,您还没有生成jquery文件 . 所以首先你需要生成它 .

    rails generate devise:install

    第一选择:

    这意味着您必须更改 /config/initializers/devise.rb 上的以下行

    config.sign_out_via =:删除到config.sign_out_via =:get

    第二种选择:

    你只能改变这一行 <%= link_to "Sign out", destroy_user_session_path %><%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 在视图文件上 .

    通常默认不写入 :method => :delete .

  • 4

    加:

    <%= csrf_meta_tag %>  and 
      <%= javascript_include_tag :defaults %>  to layouts
    

    使用这些link_to标签

    link_to 'Sign out', destroy_user_session_path, :method => :delete
    
      or
    
     link_to 'Sign out', '/users/sign_out', :method => :delete
    

    在路线中添加:

    devise_for :users do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    
  • 1

    其他选项是将注销配置为GET而不是DELETE,您可以在 /config/initializers/devise.rb 上添加以下行

    config.sign_out_via = :get
    

    但正如Steve Klabnik在他的博客上所写(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html )因为这种方法的语义,尝试使用DELETE .

  • 5

    如果您使用的是Rails 3.1,请确保您的application.html.erb注销如下:

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

    并且您的javascript包含行如下所示

    <%= javascript_include_tag 'application' %>

    我的猜测是有些宝石会覆盖default.js位置的新结构 .

  • 24

    我想补充一点,即使它有点旧 .

    “sign_out”链接不起作用,尽管有:method =>:delete .

    必须包含 <%= javascript_include_tag :defaults %> 的注释提醒我,我最近添加了JQuery java脚本,并使用简单的 <script src=""/> 标记来包含它们 .

    当我将它们从:默认为之前移动之后,sign_out再次开始工作 .

    希望这有助于某人 .

  • 3

    在github中查看源代码:

    https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)

    • #用于注销资源的默认HTTP方法 . 默认是:get . 188

    • #config.sign_out_via =:得到187

    • #用于注销资源的默认HTTP方法 . 默认是:删除 . 188

    • config.sign_out_via =:删除

  • 3

    好吧,对我来说这只是删除了:method =>:delete

    <%= link_to('Sign out', destroy_user_session_path) %>
    
  • 7

    大多数答案都是部分的我多次遇到过这个问题 . 需要解决两件事:

    <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
    

    需要指定delete方法

    然后设计使用jquery,所以你需要加载它们

    <%= javascript_include_tag "myDirectiveJSfile" %>
    

    并确保在myDirectiveJSfile.js中指定了两个jquery和jquery-ujs

    //= require jquery
    //= require jquery_ujs
    
  • 1

    我认为退出的路线是 DELETE 方法 . 这意味着您的退出链接需要如下所示:

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

    你的不包括 :method => :delete 部分 . 此外,请注意,为此,您还必须在布局文件( application.html.erb )中包含 <%= javascript_include_tag :defaults %> .

  • 7

    我在devise.rb中更改了这一行:

    config.sign_out_via = :delete
    

    config.sign_out_via = :get
    

    它开始为我工作 .

  • 6

    您可能没有包含jquery_ujs javascript文件 . 确保您使用的是最新版本的jquery-ujs:https://github.com/rails/jquery-ujs以及最后可用的文件:

    rails generate jquery:install
    

    你不应该有更多的rails.js文件 . 如果你这样做,你可能已经过时了 . 确保此文件在config / application.rb中加载了默认值

    config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
    

    (同样,你不应该在这里有rails.js文件) . 最后,添加Devise wiki(haml-style)中记录的链接:

    = link_to('Logout', destroy_user_session_path, :method => 'delete')
    

    一切都会好起来的 .

  • 13

    通过使用rails代码 = link_to('Logout', destroy_user_session_path, :method => :delete) ,使Logout链接成为DELETE RESTful调用的能力需要html属性 data-method = "delete" .

    但是,如果您没有安装gem jquery-ujs 或未通过 = javascript_include_tag "application" 在application.html中调用生成的javascript,则响应将作为GET请求发送,并且路由将失败 .

    如果您不想使用 jquery-ujs 或找不到使其工作的方法,您有几个选项:

    • devise.rb 内将 config.sign_out_via 更改为等于 :get (不推荐,因为DELETE是相应的RESTful查询)

    • 或者将 link_to 更改为 = button_to('Logout', destroy_user_session_path, :method => :delete) . 使用 button_to Rails将在进行正确的DELETE调用时进行繁重的工作 . 然后,您可以根据需要将按钮设置为类似链接的样式 .

  • 2

    尝试添加一个新路由到devise / sessions#destroy并链接到那个 . 例如:

    routes.rb
    devise_for :users do
      get 'logout' => 'devise/sessions#destroy'
    end
    

    视图:

    <%= link_to "Logout", logout_path %>
    
  • 4

    我在rails 3.1.0遇到了同样的问题,我解决了在文件中添加以下行:

    app/assets/javascripts/application.js
    //= require_tree
    //= require jquery
    //= require jquery_ujs
    
  • 5

    在routes.rb文件中使用它:

    devise_for :users do
        get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  • 9

    除了一个例外,Jessie的回答对我有用:

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

    更改:

    :delete
    

    ... 至:

    'delete'
    

    所以适合我的代码是:

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

    许多问题的答案已经存在 . 对我来说,问题有两个:

    • 当我扩展我的路线时:
    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    • 我收到警告说这是折旧的,所以我用它代替了:
    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    • 我以为我会删除我的jQuery . 糟糕的选择 . Devise正在使用jQuery“伪造”DELETE请求并将其作为GET发送 . 因此,您需要:
    //= require jquery
    //= require jquery_ujs
    
    • 当然和之前提到的链接相同:
    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
  • 5

    如果您使用HTTPS with devise,如果您的退出链接是非安全版本,它将会中断 . 在后端,它重定向到安全版本 . 该重定向是一个GET,导致问题 .

    确保您的链接使用HTTPS . 您可以在url helper中使用 protocol: "https" 强制它(确保使用url helper而不是路径助手) .

    <%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
    
  • 1
    devise_for :users
      devise_scope :user do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    
  • 10

    问题始于rails 3.1 ...在 /app/assets/javascript/ 中查找application.js .

    如果文件没有't exist create a file with that name I don'知道为什么我的文件消失或从未在 "rails new app"... 上创建 .

    该文件是 jquery... 的实例 .

  • 2

    那里有很多解决方案 . 但主要是用这个,

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

    或使用正确的sign_out方法配置devise.rb

    在devise.rb中

    config.sign_out_via = :delete ( or  :get which u like to use.)
    
  • 3

    使用 :get:delete 方法为您的路径:

    devise_scope :user do
      match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
    end
    
  • 31

    在您的routes.rb中:

    devise_for :users do
        get '/sign_out' => 'devise/sessions#destroy'
        get '/log_in' => 'devise/sessions#new'
        get '/log_out' => 'devise/sessions#destroy'
        get '/sign_up' => 'devise/registrations#new'
        get '/edit_profile' => 'devise/registrations#edit'
     end
    

    并在您的application.html.erb中:

    <%if user_signed_in?%>
              <li><%= link_to "Sign_out", sign_out_path %></li>
    <% end %>
    
  • 5

    这就是我所做的(使用Rails 3.0和Devise 1.4.2):

    • 确保您的页面加载了rails.js

    • 使用此参数:'data-method' => 'delete'

    • 添加此参数的好主意:: rel => 'nofollow'

  • 130

    在“devise_for:users”之前查看您的routes.rb是否有“resource:users”,然后尝试交换它们:

    • 作品

    • devise_for:用户

    • 资源:用户

    • 失败

    • 资源:用户

    • devise_for:用户

  • 5

    ':method => :delete ' in page is ' data-method="delete" '所以你的页面必须有jquery_ujs.js,它会提交链接方法删除而不是方法获取

  • 13

    我知道这是一个基于Rails 3的老问题,但我刚刚在Rails 4.0.4上遇到并解决了它 . 所以我想我会如何解决这个版本遇到这个问题的人 . 你的里程可能会有所不同,但这对我有用 .

    首先确保安装了gem并运行bundle install .

    gem 'jquery-rails'
    
    gem 'turbolinks'
    
    gem 'jquery-turbolinks'
    

    在application.js中检查是否需要一切如下所示 .

    Beware if this gotcha :这是 //= require jquery.turbolinks 而不是 //= require jquery-turbolinks

    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require_tree .
    

    接下来,在application.html.erb的 Headers 中添加适当的链接 .

    <%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
    <%= javascript_include_tag :defaults %>
    

    关于如何实现删除方法似乎有很多变化,我假设它取决于您使用的Rails版本 . 这是我使用的 delete 语法 .

    <p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
    

    希望有助于从这个非常令人沮丧的洞中挖出一些人!

  • 560

    一般来说,当你得到"No route matches"但你认为你已经定义了那条路线然后 double check the http verb / request method (whether its get, put, post, delete etc.) for that route .

    如果您运行rake路由,那么您将看到预期的方法,您可以将其与请求日志进行比较 .

相关问题