Ни один маршрут не совпадает с "/пользователи/выйти" разработать рельсы 3
Я установил devise на моем приложении и применил следующее в моем application.html.erb
file:
<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
и подтвердил, что все маршруты являются допустимыми.
кроме того, в моем Я devise_for :users
и root :to => "home#index"
.
Я получаю следующую ошибку маршрутизации при нажатии на ссылку" выйти":
No route matches "/users/sign_out"
есть идеи, что вызывает ошибку?
29 ответов:
Я думаю, что маршрут для выхода-это
DELETE
метод. Это означает, что ваша ссылка на выход должна выглядеть следующим образом:<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
ваш не включает в себя
:method => :delete
часть. Кроме того, обратите внимание, что для этого вы также должны включить<%= javascript_include_tag :defaults %>
в файле макета (application.html.erb
).
Я изменил эту строку в разработке.РБ:
config.sign_out_via = :delete
до
config.sign_out_via = :get
и это начало работать на меня.
вы, вероятно, не включили файл javascript jquery_ujs. Убедитесь, что вы используете последнюю версию jquery-ujs:https://github.com/rails/jquery-ujs и последние доступные файлы:
rails generate jquery:install
вы должны не есть еще рельсы.js файл. Если вы это сделаете, вы, вероятно, устарели. Убедитесь также, что этот файл загружен по умолчанию, в config/application.РБ
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(опять же, вы должны не есть рельсы.файл JS здесь.) Наконец, добавьте ссылку, как описано на разработать Вики (haml-style):
= link_to('Logout', destroy_user_session_path, :method => 'delete')
и все будет хорошо.
возможность сделать ссылку выхода из системы удаленным вызовом RESTful требует атрибута html
data-method = "delete"
с помощью кода rails= link_to('Logout', destroy_user_session_path, :method => :delete)
.однако, если у вас нет драгоценного камня
jquery-ujs
установлен или не вызывает результирующий javascript в вашем приложении.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
рельсы сделают тяжелый подъем на делать свойственный звонок удаления. Затем вы можете стилизовать кнопку, чтобы она выглядела как ссылка, Если хотите.
попробуйте добавить новый маршрут для разработки / сеансов#destroy и ссылки на него. Например:
routes.rb devise_for :users do get 'logout' => 'devise/sessions#destroy' end
view:
<%= link_to "Logout", logout_path %>
У меня была такая же проблема с рельсы 3.1.0, и я решил добавить в файл следующие строки:
app/assets/javascripts/application.js //= require_tree //= require jquery //= require jquery_ujs
используйте его в своих маршрутах.rb файл:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
за одним исключением, ответ Джесси работал для меня:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
изменения:
:delete
... к:
'delete'
Итак, код, который работал для меня:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
многие ответы на вопросы. Для меня проблема была в два раза:
когда я расширяю свои маршруты:
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. Неверный выбор. Разработки с помощью jQuery, чтобы "фальшивые" удалить заявку и отправить ее как сделать. Поэтому вам нужно:
//= require jquery //= require jquery_ujs
и конечно же ссылка как и многие упомянутые ранее:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
добавить:
<%= csrf_meta_tag %> and <%= javascript_include_tag :defaults %> to layouts
используйте эти теги link_to
link_to 'Sign out', destroy_user_session_path, :method => :delete or link_to 'Sign out', '/users/sign_out', :method => :delete
В маршруты добавить:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
другой вариант-настроить выход из системы как GET вместо DELETE, вы можете сделать это, добавив следующую строку на
/config/initializers/devise.rb
config.sign_out_via = :get
но как написал Стив Клабник в своем блоге (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html) попробуйте использовать DELETE из-за семантики этого метода.
Если вы используете Rails 3.1 убедитесь, что ваше приложение.формат html.erb выход выглядит так:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
и что ваш javascript включает строку выглядит следующим образом
<%= javascript_include_tag 'application' %>
Я предполагаю, что некоторые драгоценные камни перезаписывают новую структуру по умолчанию.js location.
проверить исходный код на GitHub:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (Дата : 27 июня 2011 года)
- # метод HTTP по умолчанию, используемый для выхода из ресурса. По умолчанию: get. 188
- # config.sign_out_via = :получить 187
- # метод HTTP по умолчанию, используемый для выхода из ресурса. По умолчанию :удалить. Сто восемьдесят восемь
- config.sign_out_via =: delete
ну, ребята для меня это было только удалить: method =>: delete
<%= link_to('Sign out', destroy_user_session_path) %>
это означает, что вы не создали файлы jquery после установки jQuery-rails gem. Поэтому сначала вам нужно его сгенерировать.
rails generate devise:install
Первый Вариант:
Это означает, что либо вы измените следующую строку на
/config/initializers/devise.rb
config.sign_out_via = :удалить файл config.sign_out_via =: get
Второй Вариант:
вы только измените эту строку
<%= 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 %>
должен быть включен напомнил мне, что я недавно добавил jQuery java script и использовал простой<script src=""/>
теги для их включения.когда я переместил их из after :defaults в before, sign_out снова начал работать.
надеюсь, это кому-то поможет.
Не забудьте включить в приложение следующую строку.js (рельсы 3)
//= require_self //= require jquery //= require jquery_ujs
включить
jquery_ujs
в моем приложении rails, и он работает сейчас.
большинство ответов являются частичной. Я много раз сталкивался с этой проблемой. Необходимо решить две проблемы:
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
метод удаления должен быть указан
затем devise использует jquery, поэтому вам нужно загрузить эти
<%= javascript_include_tag "myDirectiveJSfile" %>
и убедитесь, что оба jquery и jquery-ujs указаны в вашем myDirectiveJSfile.js
//= require jquery //= require jquery_ujs
Если вы используете HTTPS с devise, он сломается, если ваша ссылка на выход из системы относится к небезопасной версии. На заднем конце он перенаправляется на безопасную версию. Это перенаправление является GET, что вызывает проблему.
убедитесь, что ваша ссылка использует HTTPS. Вы можете заставить его с
protocol: "https"
в свой вспомогательный URL-адрес (убедитесь, что вы используете вспомогательный URL-адрес, а не вспомогательный путь).<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
в ваши маршруты.РБ :
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
и в приложении.формат html.Эрб:
<%if user_signed_in?%> <li><%= link_to "Sign_out", sign_out_path %></li> <% end %>
вот что я сделал (с Rails 3.0 и Devise 1.4.2):
- убедитесь, что ваша страница загружается рельсы.js
- используйте этот параметр: 'data-method' = > 'delete'
- хорошая идея, чтобы добавить этот param:: rel = > 'nofollow'
the
':method => :delete
'in page is'data-method="delete"
' так что ваша страница должна иметь jquery_ujs.js, он отправит ссылку с методом delete не метод get
проблема начинается с рельсов 3.1... в
/app/assets/javascript/
просто ищите приложение.js.Если файл не существует создать файл с этим именем я не знаю, почему мой файл исчезнет или никогда не был создан на
"rails new app"...
.этот файл является экземпляром для
jquery...
.
есть много решений. но в основном используйте это,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
или config devise.rb с правильным методом sign_out
In devise.РБ
config.sign_out_via = :delete ( or :get which u like to use.)
использовать
:get
и:delete
метод для вашего пути:devise_scope :user do match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete] end
смотрите, если ваши маршруты.rb имеет "resource: users" перед "devise_for: users", затем попробуйте заменить их:
работает
- devise_for :пользователи
- ресурсы :пользователи
Не
- ресурсы :пользователи
- devise_for :пользователи
В общем, когда вы получаете "нет совпадений маршрута", но вы думаете, что у вас есть этот маршрут, определенный тогда дважды проверьте метод HTTP verb / request (будь то get, put, post, delete и т. д.) для этого маршрута.
Если вы запустите rake routes, вы увидите ожидаемый метод, и вы можете сравнить его с журналом запросов.
Я знаю, что это старый вопрос, основанный на Rails 3, но я просто столкнулся и решил его на Rails 4.0.4. Поэтому я подумал, что я расскажу, как я исправил это для тех, кто сталкивается с этой проблемой с этой версией. Ваш пробег может варьироваться, но вот что сработало для меня.
сначала убедитесь, что у вас установлены драгоценные камни и запустите bundle install.
gem 'jquery-rails' gem 'turbolinks' gem 'jquery-turbolinks'
в приложения.js проверьте, что все требуется, как показано ниже.
будьте осторожны, если это попало: это
//= require jquery.turbolinks
, а не//= require jquery-turbolinks
//= require jquery //= require jquery_ujs //= require jquery.turbolinks //= require turbolinks //= require_tree .
Далее добавьте соответствующие ссылки в заголовок приложения.формат html.Эрб.
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> <%= javascript_include_tag :defaults %>
кажется, существует много вариантов реализации метода delete, который, как я предполагаю, зависит от версии Rails, которую вы используете. Это и есть
delete
синтаксис, который я использовал.<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
надеюсь, что это поможет выкопать кого-то из этой очень неприятной ямы!