设计:为什么我的注销链接不起作用?

jay*_*del 43 ruby-on-rails devise

问题:简而言之,当我尝试向我的应用程序安装注销链接时,它无法正常工作.这里有我认为放在这里的背景(如果你想要别的什么,请戳我)......

我在haml视图中得到了这个:

= link_to("Logout", destroy_user_session_path, :method => :delete)
Run Code Online (Sandbox Code Playgroud)

它在视图中生成:

<a href="/users/sign_out" data-method="delete" rel="nofollow">Logout</a>
Run Code Online (Sandbox Code Playgroud)

我在我的config/initializers/devise.rb中验证了我的设置没有注释并且正确:

config.sign_out_via = :delete
Run Code Online (Sandbox Code Playgroud)

我验证了以下路线:

destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
Run Code Online (Sandbox Code Playgroud)

我的routes.rb中也有这点诡计,我怀疑这与我的问题有关:

devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"}
resources :users
Run Code Online (Sandbox Code Playgroud)

最后一点是因为我想在自己的控制器中管理(编辑,创建和删除)用户.

我得到的错误信息如下:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User with ID=sign_out
Rails.root: /home/jaydel/projects/mbsquared-projects/Wilson-Goldrick

app/controllers/users_controller.rb:16:in `show'
Run Code Online (Sandbox Code Playgroud)

在我的服务器日志中,我看到了这个请求:

Started GET "/users/sign_out" for 127.0.0.1 at 2011-08-04 13:08:51 -0500
  Processing by UsersController#show as HTML
  Parameters: {"id"=>"sign_out"}
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

小智 83

解决这个问题的正确方法(REST方式)是更改注销链接以使用DELETE方法.这是一个非常简单的修复,改变了这个:

link_to "Log out", destroy_user_session_path
Run Code Online (Sandbox Code Playgroud)

对此:

link_to "Log out", destroy_user_session_path, :method => :delete 
Run Code Online (Sandbox Code Playgroud)


ka8*_*725 33

当我application.js从这一行删除时,我遇到了与rails 3.2相同的问题:

//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)

所以,application.js如果你没有它,我认为你必须在你的行中插入这一行.

PS.此行为意味着rails适配器jquery不起作用.因此,您应确保它是否已在浏览器中的html中加载.您应该在开发模式下测试它,因为您将在生产中使用压缩的js,并且在那里找到一些东西将非常困难.

  • 非常感谢这篇文章和解决方案.我在这个确切的问题上花了至少10小时,而且我完全不知道它来自哪里(这是问题,错误没有帮助)! (2认同)
  • 不仅是// =需要jquery_ujs,而且// =还需要jquery (2认同)

Oli*_*ves 16

问题在于,在您的日志中,注销请求是GET请求.

Started GET "/users/sign_out"
Run Code Online (Sandbox Code Playgroud)

但是注销路线是DELETE

destroy_user_session DELETE /users/sign_out(.:format) 
Run Code Online (Sandbox Code Playgroud)

为什么你越来越异常的原因是它越来越与创造的途径之一混淆resources :users这会是这样的

edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}
Run Code Online (Sandbox Code Playgroud)

基本上'sign_out'被误认为是id.

我不确定删除链接为什么不作为DELETE请求进行.虽然在改变

config.sign_out_via = :delete
Run Code Online (Sandbox Code Playgroud)

:get可以解决的问题.

  • 这不是一个好主意.您正在启用CSRF攻击.当状态发生变化时,应使用POST和DELETE.确保您的布局中包含`jquery_ujs.js` (38认同)
  • 是的,我把他的答案读作"它应该删除,而不是得到,但如果你坚持这样做,这可能会有效".我改变它删除,世界是一个更幸福的地方. (3认同)

小智 7

我已经尝试了这里提到的所有解决方案,但此问题的真正解决方案如下:

<%= link_to "Sign Out", destroy_user_session_path, 'data-turbo-method': :delete%>
Run Code Online (Sandbox Code Playgroud)

如果它不只是刷新或重新启动服务器,它就可以工作。


web*_*gen 6

你需要两者
link_to "Log out", destroy_user_session_path, method: :delete

&&这些包含在application.js中

//= require jquery
//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)

.显然,如果由于某种原因它不存在,请不要忘记将其添加到Gemfile.

gem 'jquery-rails'