Ruby on Rails - разработка пользователей / sign_out не работает - PullRequest
19 голосов
/ 06 августа 2011

Я использую devise sign_in и sign_up URL-адреса работают

, но, когда я пытаюсь использовать URL-адрес: http://localhost:3000/users/sign_out

, возникает ошибка маршрутизации

No route matches [GET] "/users/sign_out"

Как мне это исправить?

Рейк-маршруты

rake routes
        new_user_session GET    /users/sign_in(.:format)           {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)           {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)          {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)          {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)      {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)     {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)          {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)            {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)                   {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)           {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)              {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)                   {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)                   {:action=>"destroy", :controller=>"devise/registrations"}
    status_message_index GET    /status_message(.:format)          {:action=>"index", :controller=>"status_message"}
                         POST   /status_message(.:format)          {:action=>"create", :controller=>"status_message"}
      new_status_message GET    /status_message/new(.:format)      {:action=>"new", :controller=>"status_message"}
     edit_status_message GET    /status_message/:id/edit(.:format) {:action=>"edit", :controller=>"status_message"}
          status_message GET    /status_message/:id(.:format)      {:action=>"show", :controller=>"status_message"}
                         PUT    /status_message/:id(.:format)      {:action=>"update", :controller=>"status_message"}
                         DELETE /status_message/:id(.:format)      {:action=>"destroy", :controller=>"status_message"}
                    home        /home(.:format)                    {:action=>"index", :controller=>"status_message"}
                    root        /                                  {:controller=>"home", :action=>"index"}

rout.rb

Microblog::Application.routes.draw do
  devise_for :users, :controllers => {:migrations => "users/registrations"}
  resources 'status_message'
  match 'home' => 'status_message#index'
  root :to => 'home#index'
end

Ответы [ 4 ]

42 голосов
/ 06 августа 2011

Причина ошибки заключается в том, что маршрут недоступен с помощью метода GET HTTP. Обратите внимание, как выглядит соответствующая строка в вашем выводе rake routes:

destroy_user_session DELETE /users/sign_out(.:format)

Это означает, что, если вы хотите выйти из системы, вам необходимо отправить запрос DELETE на этот URL. В rails вы можете создать ссылку, которая делает это следующим образом:

link_to 'Sign out', destroy_user_session_path, :method => :delete

# alternatively (although NOT recommended):

link_to 'Sign out', '/users/sign_out', :method => :delete

Важной частью является :method => :delete. Обратите внимание, что запрос DELETE на самом деле не поддерживается браузерами, rails фактически отправляет данные, но отправляет специальный параметр, имитирующий метод DELETE.

Причиной этого является то, что URL-адрес "выхода" - это тот, который будет выходить из системы текущего пользователя, разрушительное действие. Если это было свободно доступно через браузер, это могло вызвать различные проблемы. GET-запросы никогда не должны изменять состояние сервера. Для получения дополнительной информации об этом, вот хорошая статья в Википедии: http://en.wikipedia.org/wiki/REST#RESTful_web_services

12 голосов
/ 27 марта 2012

Любое из вышеперечисленных предложений не работает для меня ....

Этот пост может быть более полезным, чтобы найти другие альтернативы. Не найдено ни одного маршрута "/ users / sign_out" devise rails 3

Мне пришлось добавить следующие строки в файл application.js

//= require_tree .
// Add following lines.
//= require jquery 
//= require jquery_ujs
0 голосов
/ 11 июля 2019

Поместите это в app / views / layouts / application.html.erb

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

Я надеюсь, что это поможет вам

0 голосов
/ 29 марта 2018

У меня были точно такие же симптомы, но я также использовал jquery-turbolinks с кладкой-рельсами, чтобы получить изображения при переходе сайта и расположении «красиво».

Я обнаружил, что это «сломало»переходы:

//= require jquery_ujs

, поэтому я удалил его, и переходы работали как чудо ... но когда я вышел из системы, я получил вышеуказанную ошибку, даже несмотря на то, что мои рейковые маршруты показали существование пути.

Оказалось, что «исправление» для меня добавило // = require rails-ujs и несколько реорганизовало моё дерево, поэтому я закончил с:

//= require rails-ujs
//= require jquery
//= require jquery.turbolinks
//= require twitter/bootstrap
//= require masonry/jquery.masonry
//= require masonry/jquery.imagesloaded.min
//= require masonry/modernizr-transitions
//= require turbolinks
//= require_tree .

В сторонуЛюбой, кто обнаружил эту ошибку во время работы в кладке, должен также добавить «clearfix с бесконечной прокруткой с поддержкой переходов» в div с идентификатором ресурса, над которым он хочет работать ... в моем случае «bookads»

<div class="transitions-enabled" id="bookads">
  <% @books.each do |book| %>
    <div class="box panel panel-default">
      <div class="panel-heading index">
        <h3 class="panel-title text-center">
          <strong><%= book.title %></strong>
        </h3>
      </div>
     <div class="panel-body">... etc

Обратите внимание, что идентификатор отдельных элементов, которые я использовал, называется "box"

В вашем coffeescript:

$ ->
  $('#bookads').imagesLoaded ->
    $('#bookads').masonry
      itemSelector: '.box'
      isFitWidth: true
      isAnimated: true

и для получения "плавной" анимации я также добавилкладка / jquery.imagesloaded.min и masonry / modernizr-переходы, как показано в дереве выше.

Надеюсь, этот ответ сэкономит кому-то несколько часов, которые я потратил на поиск решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...