没有路线匹配“ / users / sign_out”设计导轨3

不羁的心 提交于 2020-02-25 15:26:25

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

任何想法导致错误的原因是什么?


#1楼

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

  1. 作品

    • devise_for:用户
    • 资源:用户
  2. 失败

    • 资源:用户
    • devise_for:用户

#2楼

在您的route.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 %>

#3楼

要使注销链接成为DELETE RESTful调用的功能,需要使用rails code = link_to('Logout', destroy_user_session_path, :method => :delete)来实现html属性data-method = "delete"

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

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

  1. devise.rb config.sign_out_via更改为equal :get (不建议这样做,因为DELETE是适当的RESTful查询)
  2. 或将link_to更改为= button_to('Logout', destroy_user_session_path, :method => :delete) 。 使用button_to Rails将在进行正确的DELETE调用上进行繁重的工作。 然后,您可以根据需要设置按钮的样式,使其看起来像一个链接。

#4楼

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

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

jquery_ujs包含到我的Rails应用程序中,现在可以使用了。


#5楼

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

  1. 当我扩展路线时:

    devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
  2. 我收到警告称此产品已贬值,因此我将其替换为:

    devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end
  3. 我以为我会删除我的jQuery。 不好的选择。 Devise正在使用jQuery“伪造” DELETE请求并将其作为GET发送。 因此,您需要:

    //= require jquery //= require jquery_ujs
  4. 并且当然与前面提到的链接相同:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!