问题:简而言之,当我尝试向我的应用程序安装注销链接时,它无法正常工作.这里有我认为放在这里的背景(如果你想要别的什么,请戳我)......
我在haml视图中得到了这个:
= link_to("Logout", destroy_user_session_path, :method => :delete)
它在视图中生成:
Logout
我在我的config/initializers/devise.rb中验证了我的设置没有注释并且正确:
config.sign_out_via = :delete
我验证了以下路线:
destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
我的routes.rb中也有这点诡计,我怀疑这与我的问题有关:
devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"} resources :users
最后一点是因为我想在自己的控制器中管理(编辑,创建和删除)用户.
我得到的错误信息如下:
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'
在我的服务器日志中,我看到了这个请求:
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"}
有人有主意吗?
解决这个问题的正确方法(REST方式)是更改注销链接以使用DELETE方法.这是一个非常简单的修复,改变了这个:
link_to "Log out", destroy_user_session_path
对此:
link_to "Log out", destroy_user_session_path, :method => :delete
当我application.js
从这一行删除时,我遇到了与rails 3.2相同的问题:
//= require jquery_ujs
所以,application.js
如果你没有它,我认为你必须在你的行中插入这一行.
PS.此行为意味着rails适配器jquery
不起作用.因此,您应确保它是否已在浏览器中的html中加载.您应该在开发模式下测试它,因为您将在生产中使用压缩的js,并且在那里找到一些东西将非常困难.
问题在于,在您的日志中,注销请求是GET请求.
Started GET "/users/sign_out"
但是注销路线是DELETE
destroy_user_session DELETE /users/sign_out(.:format)
为什么你越来越异常的原因是它越来越与创造的途径之一混淆resources :users
这会是这样的
edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}
基本上'sign_out'被误认为是id.
我不确定删除链接为什么不作为DELETE请求进行.虽然在改变
config.sign_out_via = :delete
是:get
可以解决的问题.
你需要两者
link_to "Log out", destroy_user_session_path, method: :delete
&&这些包含在application.js中
//= require jquery //= require jquery_ujs
.显然,如果由于某种原因它不存在,请不要忘记将其添加到Gemfile.
gem 'jquery-rails'