No route matches [GET] " / пользователи / выход"
вот моя фактическая ошибка:No route matches [GET] "/members/sign_out"
Поскольку большинство людей будут использовать "пользователей", я подумал, что было бы более полезно иметь это в названии. Во всяком случае, я не могу выйти из системы. Я могу успешно Редактировать профиль участника.
Я использую devise 1.4.2 и Rails 3.1.0.алгоритм RC4. Кроме того, я создал две отдельные модели разработки - одну под названием "члены", а другую под названием "администраторы". Я смог зарегистрироваться и войти в оба из них (одновременно), вручную перейдя к правильный путь URL (т. е. localhost: 3000 / admins/sign_in/). Я создал несколько ссылок в своем приложении.формат html.haml файл макета, следуя этому RailsCast на Devise. Я знаю, что он обращается только к ссылкам входа/выхода для "членов"."
если я нажму на ссылку signout, я получу вышеуказанную ошибку. Это происходит, если я вручную перехожу к URL-адресу выхода (т. е. localhost: 3000/admins/sign_out/).
может кто-нибудь сказать мне, почему это происходит? Ниже приведены различные соответствующий файл. И конечно, я новичок...
rake маршруты вывода:
    j(film_repo)$ rake routes
        new_member_session GET    /members/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            member_session POST   /members/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           member_password POST   /members/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_member_password GET    /members/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_member_password GET    /members/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /members/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_member_registration GET    /members/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       member_registration POST   /members(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_member_registration GET    /members/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_member_registration GET    /members/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /members(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /members(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
         new_admin_session GET    /admins/sign_in(.:format)        {:action=>"new", :controller=>"devise/sessions"}
             admin_session POST   /admins/sign_in(.:format)        {:action=>"create", :controller=>"devise/sessions"}
     destroy_admin_session DELETE /admins/sign_out(.:format)       {:action=>"destroy", :controller=>"devise/sessions"}
            admin_password POST   /admins/password(.:format)       {:action=>"create", :controller=>"devise/passwords"}
        new_admin_password GET    /admins/password/new(.:format)   {:action=>"new", :controller=>"devise/passwords"}
       edit_admin_password GET    /admins/password/edit(.:format)  {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /admins/password(.:format)       {:action=>"update", :controller=>"devise/passwords"}
 cancel_admin_registration GET    /admins/cancel(.:format)         {:action=>"cancel", :controller=>"devise/registrations"}
        admin_registration POST   /admins(.:format)                {:action=>"create", :controller=>"devise/registrations"}
    new_admin_registration GET    /admins/sign_up(.:format)        {:action=>"new", :controller=>"devise/registrations"}
   edit_admin_registration GET    /admins/edit(.:format)           {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /admins(.:format)                {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /admins(.:format)                {:action=>"destroy", :controller=>"devise/registrations"}
                     films GET    /films(.:format)                 {:action=>"index", :controller=>"films"}
                           POST   /films(.:format)                 {:action=>"create", :controller=>"films"}
                  new_film GET    /films/new(.:format)             {:action=>"new", :controller=>"films"}
                 edit_film GET    /films/:id/edit(.:format)        {:action=>"edit", :controller=>"films"}
                      film GET    /films/:id(.:format)             {:action=>"show", :controller=>"films"}
                           PUT    /films/:id(.:format)             {:action=>"update", :controller=>"films"}
                           DELETE /films/:id(.:format)             {:action=>"destroy", :controller=>"films"}
                      root        /                                {:controller=>"films", :action=>"index"}
маршруты.rb
FilmRepo::Application.routes.draw do
  devise_for :members
  devise_for :admins
  resources :films
  root :to => 'films#index'
end
админ.РБ (модель)
class Admin < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, and :omniauthable
  devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable
  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end
член.РБ (модель)
class Member < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end
приложение.формат html.Haml на
!!!
%html
    %head
        %title Film Repo
        = stylesheet_link_tag 'compiled/screen.css', :media => 'screen, projection'
        = stylesheet_link_tag 'compiled/print.css', :media => 'print'
        /[if lt IE 8]
            = stylesheet_link_tag 'compiled/ie.css', :media => 'screen, projection'
            = csrf_meta_tag
    %body.bp
        #container
            #user_nav
                - if member_signed_in?
                    Signed in as #{current_member.email}. Not you?
                    #{link_to "Sign out", destroy_member_session_path}
                - else
                    = link_to "Sign up", new_member_registration_path
                    or #{link_to "sign in", new_member_session_path}
                - flash.each do |name, msg|
                    = content_tag :div, msg, :id => "flash_#{name}"
            = yield
19 ответов
У меня была аналогичная проблема, но добавление :method=> :delete не сработало. Я смог добавить новый маршрут для запроса get, комментируя devise_for: users и добавляя
devise_for :users do
  get '/users/sign_out' => 'devise/sessions#destroy'
end
вы можете завершить сеанс через get, изменив конфигурацию devise в инициализаторах.
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get
просто откройте ссылку, и ваш сеанс будет удален.
хотя я не знаю причину, причина, по которой вы получаете это сообщение, заключается в том, что в ваших маршрутах у вас есть
destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
что означает, что маршрут доступен только с методом DELETE, а не GET. Это немного странно, так как в документах для devise говорится, что он должен создать его как GET route (https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L30)
С ним в качестве маршрута удаления вы сможете выйти из системы используя
link_to :logout, destroy_member_session_path, :method => :delete 
у меня была похожая проблема. Мой код представления был таким:
  <%= link_to " exit", destroy_user_session_path, method: :delete %>
после добавления следующего изменения в маршруты.rb это сработало,
devise_for :users
devise_scope :user do  
   get '/users/sign_out' => 'devise/sessions#destroy'     
end
мы все еще можем использовать :method => :delete в моем коде, вот так
 = link_to "Sign out", destroy_user_session_path,:method => :delete
причина, по которой я думаю, что мы не можем загрузить javascript, который включает jquery, убедитесь, что
= javascript_include_tag "application" (haml- you can use html too)
включить jQuery-ui и jquery-ujs. Поэтому, если это все еще ошибка, Я предлагаю изменить rails gem в GEMFILE на версию 3.2.6 и вызвать bundle update обновить камней. Это работает для меня!
= link_to "Sign out", destroy_user_session_path,:method => :delete
будет не работа вместо этого используйте это,
= link_to "Sign out", destroy_user_session_path,:method => 'delete'
должен сделать трюк или в худшем случае добавить require jquery_ujs в своем приложение.js
В devise.rb, change
 config.sign_out_via = :delete
to
config.sign_out_via = :get
это работает для меня.  Я сошел с ума от этого, потому что по умолчанию -delete и я не понимаю, почему.
это работает, но я не уверен, влияет ли она на другие элементы в приложении.
использую Rails4, я должен был использовать следующий метод:
<%= link_to "Logout", destroy_admin_session_path, method: :delete %>
акцент на том, где двоеточия находятся на методе: и: delete
может быть, это поможет кому-то. Обновлен с Rails 3.0 до 3.1 и обнаружил эту проблему. Это исправило его для меня:
маршруты.rb:
    devise_for: пользователи 
придумать.rb:
    конфиг.sign_out_via = :удалить 
приложение.формат html.Эрб:
<%= javascript_include_tag "application" %>     
* нет: по умолчанию
_login_items.формат html.Эрб:
<%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
app / активы / javascripts / приложение.Яш
//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require_tree .
и у меня был в javascript / jquery.js, jquery_ujs.js из версии 3.0, которую я удалил.
возможно, вы удалили активы / javascripts/*
выполнить rails generate jquery:install --ui это создаст все javascripts, как показано ниже
xxxx@xxxxx:~/Projects/Rails_apps/rtest$ rails generate jquery:install --ui
      remove  public/javascripts/prototype.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/controls.js
     copying  jQuery (1.7.1)
      create  public/javascripts/jquery.js
      create  public/javascripts/jquery.min.js
     copying  jQuery UI (1.8.16)
      create  public/javascripts/jquery-ui.js
      create  public/javascripts/jquery-ui.min.js
     copying  jQuery UJS adapter (822920)
      remove  public/javascripts/rails.js
      create  public/javascripts/jquery_ujs.js
перейти к макету e.G применение.формат html.erb и edit <%= javascript_include_tag :all %>
что сработало для меня :)
FWIW я также столкнулся с этой проблемой. Рассмотрели все предложенные ответы, однако единственным, который работал, было фото открытых маршрутов.rb и прокомментируйте следующую строку:
devise_for :users
под этим добавьте следующую строку:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
проблема начинается с Rails 3.1 в assets/javascript/. Просто ищите application.js, а если файл не существует, создайте файл с таким именем. Я не знаю, почему мой файл исчезает или никогда не был создан на rails new app... этот файл является экземпляром для jQuery.
@creamhost сказать,
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
но это не правильное решение для меня (Rails4). Я решил нашу проблему (ответ@Olives),
link_to :logout, destroy_member_session_path, method: :delete
просто используйте следующую ссылку для выхода из системы:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
//= require jquery_ujs
вам не хватает этой строки в ваших активах. Там нет необходимости, чтобы получить /users/signout запрос. Поместите эту строку в файл JavaScript в самой верхней части страницы.
имел ту же проблему и вспомнил, что это началось только после того, как я решил "очистить" Мои файлы Javascript. Поэтому я побежал rails generate jquery:install --ui снова и это решено для меня. (Вы можете игнорировать часть --ui, если вам не нужен jQuery UI, я полагаю.)
Я получал ту же ошибку, что и OP для /users / sign_out, потому что я получал ее вместо удаления (я тоже 1-й год dev). После проверки github через этот ответ я отправил запрос на вытягивание, чтобы исправить его!
https://github.com/plataformatec/devise/pull/2040
Пойти С. О. !!!
это происходит только в windows.. Добавьте в приложение следующее.формат html.файл erb.
devise_for: users
devise_scope: пользователь do
   get '/ users / sign_out '= > 'devise / sessions#destroy'
конец
