Ни один маршрут не совпадает с "/пользователи/выйти" разработать рельсы 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 379

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 или не может найти способ сделать это работа:

  1. изменить config.sign_out_via равной :get внутри devise.rb (Не рекомендуется, так как DELETE-это соответствующий запрос RESTful)
  2. или изменить 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' %>

многие ответы на вопросы. Для меня проблема была в два раза:

  1. когда я расширяю свои маршруты:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. Я получал предупреждение, что это обесценивается, поэтому я заменил его:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. Я думал, что удалю свой jQuery. Неверный выбор. Разработки с помощью jQuery, чтобы "фальшивые" удалить заявку и отправить ее как сделать. Поэтому вам нужно:

    //= require jquery
    //= require jquery_ujs
    
  4. и конечно же ссылка как и многие упомянутые ранее:

    <%= 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
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

в ваши маршруты.РБ :

 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):

  1. убедитесь, что ваша страница загружается рельсы.js
  2. используйте этот параметр: 'data-method' = > 'delete'
  3. хорошая идея, чтобы добавить этот 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", затем попробуйте заменить их:

  1. работает

    • devise_for :пользователи
    • ресурсы :пользователи
  2. Не

    • ресурсы :пользователи
    • 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>

надеюсь, что это поможет выкопать кого-то из этой очень неприятной ямы!