Я установил devise в своем приложении и применил в своем application.html.erb
файле следующее:
<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
и подтвердил, что все маршруты действительны.
Кроме того, в моем routes.rb
файле я devise_for :users
и root :to => "home#index"
.
Я получаю следующую ошибку при нажатии на ссылку «Выйти»:
No route matches "/users/sign_out"
Есть идеи, что является причиной ошибки?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
. Это ничего не сделало, хотя.Ответы:
Я думаю, что путь для выхода - это
DELETE
метод. Это означает, что ваша ссылка для выхода должна выглядеть так:Ваш не включает в себя
:method => :delete
часть. Также обратите внимание, что для того, чтобы это работало, вы также должны включить его<%= javascript_include_tag :defaults %>
в файл макета (application.html.erb
).источник
link_to "Sign out", destroy_user_session_path
всегда был достаточно хорош для меня.$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
- если на странице загружен jQuery.Я изменил эту строку в devise.rb:
в
и это начало работать для меня.
источник
config.sign_out_via = [ :post, :delete ]
илиdevise_for :users, :sign_out_via => [ :post, :delete ]
, как описано в DEViSE / рельсы / routes.rb .Возможно, вы не включили javascript-файл jquery_ujs. Убедитесь, что вы используете последнюю версию jquery-ujs: https://github.com/rails/jquery-ujs и последние доступные файлы:
У вас не должно быть больше файла rails.js. Если вы это сделаете, вы, вероятно, устарели. Убедитесь, что этот файл загружен с настройками по умолчанию, в config / application.rb
(Опять же, у вас не должно быть файла rails.js здесь). Наконец, добавьте ссылку, как описано в вики Devise (haml-style):
И все будет хорошо.
источник
javascript_include_tag "jquery_ujs"
application.js
. Плохое предположение, я полагаю. Спасибо.Чтобы сделать ссылку выхода из системы вызовом DELETE RESTful, необходим атрибут html
data-method = "delete"
с использованием кода rails= link_to('Logout', destroy_user_session_path, :method => :delete)
.Однако, если у вас не установлен гем
jquery-ujs
или вы не вызываете полученный javascript в вашем application.html через= javascript_include_tag "application"
, ответ будет отправлен как GET-запрос, и маршрут потерпит неудачу.У вас есть несколько вариантов, если вы не хотите использовать
jquery-ujs
или не можете найти способ заставить его работать:config.sign_out_via
на равный:get
внутриdevise.rb
(не рекомендуется, так как DELETE - это соответствующий запрос RESTful)link_to
к= button_to('Logout', destroy_user_session_path, :method => :delete)
. Сbutton_to
Rails сделает тяжелую работу по правильному вызову DELETE. Затем вы можете оформить кнопку, чтобы она выглядела как ссылка, если хотите.источник
button_to
, Rails генерируетform
для всего действия. Вот почему можно использовать:delete
метод с,button_to
а не сlink_to
, просто посмотреть сгенерированный HTML.Попробуйте добавить новый маршрут для devise / session # destroy и создать ссылку на него. Например:
Посмотреть:
источник
link_to
вызову, как описано в другом ответе.Используйте его в вашем файле rout.rb:
источник
У меня была та же проблема с рельсами 3.1.0, и я решил добавить в файл следующие строки:
источник
Ответ Джесси работал за одним исключением:
изменение:
... для:
Итак, код, который работал для меня:
источник
Много ответов уже на вопрос. Для меня проблема была в два раза:
когда я расширяю свои маршруты:
Я получал предупреждение, что это устарело, поэтому я заменил его на:
Я думал, что я удалю свой JQuery. Плохой выбор. Devise использует jQuery для "подделки" запроса DELETE и отправки его как GET. Поэтому вам необходимо:
и, конечно, та же ссылка, что и многие упомянутые ранее:
источник
Добавить:
Используйте эти теги link_to
В маршруты добавьте:
источник
Другой вариант - настроить выход из GET вместо DELETE, это можно сделать, добавив следующую строку в
/config/initializers/devise.rb
Но, как Стив Клабник написал в своем блоге ) попробуйте использовать DELETE из-за семантики этого метода.
источник
Если вы используете Rails 3.1, убедитесь, что ваш выход из application.html.erb выглядит следующим образом:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
И что ваша строка включения JavaScript выглядит следующим образом
<%= javascript_include_tag 'application' %>
Я предполагаю, что некоторые драгоценные камни перезаписывают новую структуру местоположения default.js.
источник
Проверьте это с помощью исходного кода в github:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (дата: 27 июня 2011 г.)
источник
Ну, ребята, для меня это было только удалить: method =>: delete
источник
Это означает, что вы не сгенерировали файлы jquery после того, как установили гем jquery-rails. Итак, сначала вам нужно его сгенерировать.
rails generate devise:install
Первый вариант:
Это означает, что вы должны изменить следующую строку на
/config/initializers/devise.rb
config.sign_out_via =: удалить в config.sign_out_via =: получить
Второй вариант:
Вы только измените эту строку
<%= link_to "Sign out", destroy_user_session_path %>
на<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
на файл просмотра.Обычно
:method => :delete
не пишется по умолчанию.источник
Я хочу добавить к этому, хотя он немного стар.
ссылка "sign_out" не работает, несмотря на наличие: method =>: delete.
Комментарий, указывающий, что
<%= javascript_include_tag :defaults %>
должен быть включен, напомнил мне, что я недавно добавил jQ-скрипт JQuery и использовал простой<script src=""/>
теги для их включения.Когда я переместил их с после: default по умолчанию на before, sign_out снова начал работать.
Надеюсь, это кому-нибудь поможет.
источник
Большинство ответов являются частичными. Я сталкивался с этой проблемой много раз. Необходимо учесть две вещи:
метод удаления должен быть указан
Затем devise использует jquery, поэтому вам нужно загрузить
и убедитесь, что ОБА jquery и jquery-ujs указаны в вашем myDirectiveJSfile.js
источник
Не забудьте включить следующую строку в ваш application.js (Rails 3)
Включите
jquery_ujs
в мое приложение рельсы, и это работает сейчас.источник
Если вы используете HTTPS с устройством devise , оно прервется, если ваша ссылка для выхода будет иметь небезопасную версию. На бэкэнде он перенаправляет на защищенную версию. Это перенаправление является GET, который вызывает проблему.
Убедитесь, что ваша ссылка использует HTTPS. Вы можете использовать его
protocol: "https"
в вашем помощнике по URL (убедитесь, что вы используете помощника по URL, а не по пути).источник
источник
Проблема начинается с рельсов 3.1 ...
/app/assets/javascript/
просто посмотрите на application.js.Если файл не существует, создайте файл с таким именем, я не знаю, почему мой файл исчез или никогда не создавался в
"rails new app"...
.Этот файл является экземпляром для
jquery...
.источник
Много решений там. но в основном используют это,
или настройте devise.rb с правильным методом sign_out
В devise.rb
источник
Используйте
:get
и:delete
метод для вашего пути:источник
В ваших маршрутах:
и в вашем application.html.erb:
источник
Вот что я сделал (с Rails 3.0 и Devise 1.4.2):
источник
Посмотрите, есть ли у вашего route.rb «resource: users» перед «devise_for: users», затем попробуйте поменять их местами:
Работает
Сбой
источник
':method => :delete
«в странице»data-method="delete"
'так что ваша страница должна иметь jquery_ujs.js, он будет представлять ссылку с помощью метода удаления не метод GETисточник
Я знаю, что это старый вопрос, основанный на Rails 3, но я столкнулся и решил его на Rails 4.0.4. Так что я подумал, как я могу исправить это для тех, кто столкнулся с этой проблемой в этой версии. Ваш пробег может варьироваться, но вот что сработало для меня.
Сначала убедитесь, что у вас установлены гемы, и запустите пакетную установку.
В application.js проверьте, что все требуется, как показано ниже.
Осторожно, если это правильно : это
//= require jquery.turbolinks
и не//= require jquery-turbolinks
Затем добавьте соответствующие ссылки в заголовок application.html.erb.
Кажется, есть много вариантов реализации метода удаления, который, как я полагаю, зависит от версии Rails, которую вы используете. Это
delete
синтаксис, который я использовал.Надеюсь, что это поможет выкопать кого-то из этой очень неприятной дыры!
источник
В общем, когда вы получаете «Нет совпадений маршрутов», но думаете, что этот маршрут определен, дважды проверьте метод глагола / запроса http (будь то get, put, post, delete и т. Д.) Для этого маршрута. .
Если вы запускаете рейковые маршруты, вы увидите ожидаемый метод и сможете сравнить его с журналом запросов.
источник