Ruby on rails “没有路线匹配”/用户/注销;设计轨道3

Ruby on rails “没有路线匹配”/用户/注销;设计轨道3,ruby-on-rails,ruby-on-rails-3,devise,routes,Ruby On Rails,Ruby On Rails 3,Devise,Routes,我已在我的应用程序上安装了Desive,并在我的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_

我已在我的应用程序上安装了Desive,并在我的
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>

你知道是什么导致了这个错误吗?

我认为注销的方法是
DELETE
方法。这意味着您的注销链接需要如下所示:

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

您的不包括
:method=>:delete
部分。另外,请注意,要使其起作用,您还必须在布局文件(
application.html.erb
)中包含

尝试添加新路由来设计/会话#销毁并链接到该路由。例如:

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


您可能没有包含jquery\u ujs javascript文件。确保您使用的是最新版本的jquery ujs:和最后可用的文件:

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

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(同样,这里不应该有rails.js文件)。 最后,添加上记录的链接(haml样式):


一切都会好起来的

除了一个例外,杰西的回答对我很有用:

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

'delete'
因此,对我有效的代码是:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
”删除“%”

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

config.sign_out_via = :delete


它开始为我工作

使用github中的源代码查看它:

(日期:2011年6月27日)

  • #用于注销资源的默认HTTP方法。默认值是:get。 188
  • #config.sign_out_via=:get 187
  • #用于注销资源的默认HTTP方法。默认值为:删除。 188
  • config.sign_out_via=:删除

好吧,伙计们,对我来说,只是删除:方法=>:delete

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

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

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
这就是我所做的(使用Rails 3.0和Desive 1.4.2):

  • 确保页面加载rails.js
  • 使用此参数:“数据方法”=>“删除”
  • 添加此参数的好主意::rel=>“nofollow”

  • 问题从rails 3.1开始。。。在
    /app/assets/javascript/
    中,只需查找application.js

    如果文件不存在,请创建一个具有该名称的文件,我不知道为什么我的文件会消失或从未在
    “rails新应用程序”上创建过…


    该文件是
    jquery…

    的实例,尽管它有点旧,但我还是想添加到该文件中

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

    表示必须包含
    的注释提醒我最近添加了jqueryjava脚本,并使用简单的
    标记来包含它们

    当我将它们从:defaults之后移到before之后,注销再次开始工作

    希望这对某人有所帮助。

    添加:

      <%= csrf_meta_tag %>  and 
      <%= javascript_include_tag :defaults %>  to layouts
    
    在路线中添加:

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

    另一个选项是将注销配置为GET而不是DELETE,您可以在
    /config/initializers/designe.rb

    config.sign_out_via = :get
    

    但正如史蒂夫·克拉布尼克在他的博客上写道的那样(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html)由于此方法的语义,请尝试使用DELETE

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

    :删除%>

    您的javascript包含行如下所示


    我猜有些gem会覆盖default.js位置的新结构。

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

    rails生成设备:安装

    第一种选择:

    这意味着您必须更改
    /config/initializers/designe.rb

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

    第二种选择:

    您只需将视图文件上的此行
    更改为
    :delete%>


    通常默认情况下不会写入
    :method=>:delete

    在routes.rb文件中使用它:

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

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

  • 工作

    • 为:用户设计
    • 资源:用户
  • 失败

    • 资源:用户
    • 为:用户设计
  • 在您的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 %>
    
    
    

  • 使注销链接成为DELETE RESTful调用的能力需要一个html属性
    data method=“DELETE”
    ,使用rails code
    =link\u to('Logout',destroy\u user\u session\u path,:method=>:DELETE)

    但是,如果您没有安装gem
    jquery ujs
    ,或者没有通过
    =javascript\u include\u标记“application”
    在application.html中调用生成的javascript,则响应将作为GET请求发送,路由将失败

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

  • 通过将
    config.sign\u out\u更改为等于
    :在
    design.rb中获取
    (不推荐,因为DELETE是适当的RESTful查询)
  • 或者将
    链接更改为
    =按钮更改为('Logout',destroy\u user\u session\u path,:method=>:delete)
    。使用
    按钮_to
    Rails将在进行正确的删除调用时完成繁重的工作。然后,如果愿意,可以将按钮样式设置为链接

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


    jquery\u ujs
    包含到我的rails应用程序中,它现在就可以工作了。

    这个问题已经有很多答案了。对我来说,问题有两个方面:

  • 当我扩展路线时:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  • config.sign_out_via = :get
    
    devise_for :users do
        get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
     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
    
    <%if user_signed_in?%>
              <li><%= link_to "Sign_out", sign_out_path %></li>
    <% end %>
    
    //= require_self
    //= require jquery
    //= require jquery_ujs
    
    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    //= require jquery
    //= require jquery_ujs
    
    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
    <%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
    
    config.sign_out_via = :delete ( or  :get which u like to use.) 
    
    <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
    
       <%= javascript_include_tag "myDirectiveJSfile" %> 
    
    //= require jquery
    //= require jquery_ujs
    
    <%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
    
    devise_scope :user do
      match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
    end
    
      devise_for :users
      devise_scope :user do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    
    gem 'jquery-rails'
    
    gem 'turbolinks'
    
    gem 'jquery-turbolinks'
    
    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require_tree .
    
    <%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
    <%= javascript_include_tag :defaults %>
    
    <p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>