2012-03-06 32 views
6

Tôi hơi bối rối về cách dự đoán định tuyến các yêu cầu của tôi, vì một lý do nào đó tôi không thể đi tới đường dẫn đăng nhập trong ứng dụng của mình bây giờ:Devise/Rails: Không có tuyến đường nào phù hợp với [GET] "/ users/sign_out"

ActionController::RoutingError (No route matches [GET] "https://stackoverflow.com/users/sign_out") 

đây là những gì các tuyến đường của tôi liên quan đến mô hình tài khoản của tôi và lập mưu trông giống như:

devise_for :users, :controllers => {:registrations => "registrations"} 
devise_scope :user do 
    get '/settings' => 'registrations#edit' 
end 

Would xác định phạm vi mà ngăn chặn các tuyến đường khác của tôi từ làm việc không?

Cập nhật

Tôi không nghĩ rằng đó là nghĩa vụ phải GET yêu cầu, như liên kết của tôi trông giống như:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 
+0

Nó phải là một yêu cầu DELETE. Điều gì sẽ xảy ra nếu bạn chỉ cần rời khỏi devise_for: người dùng trong các tuyến đường của bạn? – gtr32x

+1

JavaScript của bạn có gặp phải bất kỳ lỗi nào không? Nó thực sự là javascript không phô trương mà sẽ làm cho đây là một cuộc gọi http DELETE. –

+0

Tệp cấu hình Devise của bạn có cho mục sau đây: '' 'config.sign_out_via''' –

Trả lời

14

Nếu bạn cố gắng để đi đến/người dùng/sign_out bằng cách gõ nó vào thanh địa chỉ của trình duyệt của bạn, hoặc liên kết đến nó bình thường, bạn sẽ nhận được lỗi này. Để tóm tắt một số nhận xét và câu trả lời tại đây và từ các vấn đề tại repo về github:

Đây là chức năng dự định, ứng dụng RESTful không được sửa đổi trạng thái với yêu cầu GET.

Bạn có thể sửa lỗi này bằng cách tạo liên kết sử dụng phương thức DELETE như đã đề cập bởi @Trip, @fuzzyalej và cập nhật của @Joseph Silvashy.

Ngoài ra, (và ít khuyến khích), trong /config/initializers/devise.rb, bạn có thể thực hiện thay đổi sau

config.sign_out_via = :delete 

để

config.sign_out_via = :get 

Tôi đã xem qua vấn đề này trong khi sau cùng với http://railscasts.com/episodes/209-introducing-devise và với phiên bản cũ hơn mà anh ta sử dụng ở đó, đây không phải là vấn đề.

+1

Đối với tôi, 'application.js' chỉ đơn giản là thiếu (đường ray 4 mẫu từ railswizard.com) và cần các dòng: ' // = jquery // = jquery_ujs' – snowking16

7

Chỉ cần để bài này có một câu trả lời:

này phải được gửi cùng với phương thức, delete để phương thức này không được mặc định là get

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

Từ rails documentation:

link_to("Destroy", "http://www.example.com", :method => :delete, :confirm => "Are you sure?") 
# => <a href='http://www.example.com' rel="nofollow" data-method="delete" data-confirm="Are you sure?">Destroy</a> 
3

Nếu bạn đang sử dụng SSL với bộ điều khiển Devise và cố gắng đăng xuất khỏi url 'http', điều đang xảy ra là gửi yêu cầu DELETE tới phương thứC#destroy, nhưng sau đó chuyển hướng đến phiên bản https qua GET. Bạn có thể khắc phục điều này bằng cách thêm https đến dấu hiệu ra liên kết như vậy:

= link_to "Sign out", destroy_user_session_url(protocol: 'https'), method: :delete 

Lưu ý: phải là 'url' thay vì 'path'

+0

sau khi thay đổi: Kết nối an toàn Không thành công! (Mã lỗi: ssl_error_rx_record_too_long) – Dineshkumar

0

tôi đã cùng một vấn đề và giải quyết nó mất những bước sau: 1) bao gồm // = đòi hỏi jquery_ujs trong tài sản/Javascripts/application.js 2) thêm đá quý 'jquery-ray' để gemfile tôi 3) bó cài đặt

... và nó làm việc.

Các vấn đề liên quan