我已經在個人應用程序上安裝了devise,並在個人application.html.erb
文件中應用瞭如下內容: javascript
<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
並確認全部路線均有效。 html
另外,在個人routes.rb
文件中,我有devise_for :users
和root :to => "home#index"
。 java
單擊「註銷」連接時,出現如下路由錯誤: jquery
No route matches "/users/sign_out"
任何想法致使錯誤的緣由是什麼? session
在「 devise_for:users」以前查看您的routes.rb是否具備「 resource:users」,而後嘗試交換它們: app
做品 ui
失敗 spa
在您的route.rb中: code
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中: htm
<%if user_signed_in?%> <li><%= link_to "Sign_out", sign_out_path %></li> <% end %>
要使註銷連接成爲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
或沒法找到使其工做的方法,則有幾種選擇:
devise.rb
config.sign_out_via
更改成equal :get
(不建議這樣作,由於DELETE是適當的RESTful查詢) link_to
更改成= button_to('Logout', destroy_user_session_path, :method => :delete)
。 使用button_to
Rails將在進行正確的DELETE調用上進行繁重的工做。 而後,您能夠根據須要設置按鈕的樣式,使其看起來像一個連接。 不要忘記在application.js中添加如下行(Rails 3)
//= require_self //= require jquery //= require jquery_ujs
將jquery_ujs
包含到個人Rails應用程序中,如今可使用了。
這個問題已經有不少答案。 對我來講,問題有兩個方面:
當我擴展路線時:
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 %>