ruby-on-rails - test - rails devise after sign up




Нет маршрутов совпадений «/ users/sign_out» devise rails 3 (20)

use :get и :delete метод для вашего пути:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end

Я установил приложение для своего приложения и применил следующее в файле 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"

Любые идеи, что вызывает ошибку?


Большинство ответов являются частичными. Я много раз сталкивался с этой проблемой. Необходимо рассмотреть две вещи:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

необходимо указать метод удаления

Затем devise использует jquery, поэтому вам нужно загрузить эти

   <%= javascript_include_tag "myDirectiveJSfile" %> 

и убедитесь, что BOTH jQuery и jquery-ujs указаны в вашем myDirectiveJSfile.js

//= require jquery
//= require jquery_ujs

Вероятно, вы не включили javascript-файл jquery_ujs. Убедитесь, что вы используете последнюю версию jquery-ujs: https://github.com/rails/jquery-ujs и последние доступные файлы:

rails generate jquery:install

У вас не должно быть больше файла rails.js. Если вы это сделаете, вы, вероятно, устарели. Убедитесь, что этот файл загружен по умолчанию, в config / application.rb

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(Опять же, вы не должны иметь файл rails.js здесь). Наконец, добавьте ссылку, как описано в Devise wiki (haml-style):

= link_to('Logout', destroy_user_session_path, :method => 'delete')

И все будет хорошо.


Для того, чтобы связать ссылку «Выйти» с вызовом DELETE RESTful, требуется атрибут html data-method = "delete" , используя код rails = link_to('Logout', destroy_user_session_path, :method => :delete) .

Однако, если у вас нет установленного gem jquery-ujs или не вызывается полученный javascript в приложении application.html через = javascript_include_tag "application" , ответ будет отправлен как запрос GET, и маршрут не будет выполнен.

У вас есть несколько вариантов, если вы не хотите использовать jquery-ujs или не можете найти способ заставить его работать:

  1. Измените config.sign_out_via равным :get devise.rb в devise.rb (не рекомендуется, поскольку DELETE - это соответствующий запрос RESTful)
  2. ИЛИ Измените link_to на = button_to('Logout', destroy_user_session_path, :method => :delete) . С помощью button_to Rails будет выполняться тяжелый подъем при правильном вызове DELETE. Затем вы можете направить кнопку, чтобы выглядеть как ссылка, если хотите.

Другой вариант - настроить выход из системы как 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 из-за семантики этого метода.


Если вы используете HTTPS с устройством , он будет разорван, если ваша ссылка на выход недоступна для незащищенной версии. На задней панели он перенаправляется на защищенную версию. Это перенаправление - это GET, что вызывает проблему.

Убедитесь, что ваша ссылка использует HTTPS. Вы можете заставить его использовать protocol: "https" в вашем помощнике URL (убедитесь, что вы используете помощник URL, а не помощник пути).

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>

За одним исключением, ответ Джесси работал для меня:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

менять:

:delete

... для:

'delete'

Таким образом, код, который работал для меня:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>

Используйте его в файле routes.rb:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end

Не забудьте включить следующую строку в application.js (Rails 3)

//= require_self
//= require jquery
//= require jquery_ujs

Включите jquery_ujs в мое приложение rails, и оно работает сейчас.


Ну, ребята для меня это только удалили: method =>: delete

<%= link_to('Sign out', destroy_user_session_path) %>

Посмотрите, есть ли у вашего route.rb «ресурс: пользователи» перед «devise_for: users», затем попробуйте их заменить:

  1. Работает

    • devise_for: пользователи
    • ресурсов: пользователей
  2. Сбой

    • ресурсов: пользователей
    • devise_for: пользователи

Проблема начинается с rails 3.1 ... in /app/assets/javascript/ просто найдите application.js.

Если файл не существует, создайте файл с этим именем, я не знаю, почему мой файл исчез или никогда не был создан в "rails new app"...

Этот файл является экземпляром для jquery...


Там много решений. но в основном используют это,

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

или config devise.rb с соответствующим методом sign_out

В devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 

У меня была та же проблема с rails 3.1.0, и я решил добавить в файл следующие строки:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs

Это означает, что вы не сгенерировали файлы 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 не записывается по умолчанию.


Это то, что я сделал (с Rails 3.0 и Devise 1.4.2):

  1. Убедитесь, что ваша страница загружает rails.js
  2. Используйте этот параметр: 'data-method' => 'delete'
  3. Хорошая идея добавить этот параметр:: rel => 'nofollow'

Я знаю, что это старый вопрос, основанный на Rails 3, но я просто столкнулся с ним и решил его на Rails 4.0.4. Поэтому я подумал, что смогу понять, как я исправил его для тех, кто сталкивается с этой проблемой с этой версией. Ваш пробег может измениться, но вот что сработало для меня.

Сначала убедитесь, что у вас установлены драгоценные камни и запущена установка пакета.

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

В application.js убедитесь, что все требуется, как показано ниже.

Остерегайтесь, если это получено : это //= require jquery.turbolinks а не //= require jquery-turbolinks

//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .

Затем добавьте соответствующие ссылки в заголовок application.html.erb.

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

Кажется, что существует много вариантов того, как реализовать метод удаления, который, как я полагаю, зависит от версии Rails, которую вы используете. Это синтаксис delete я использовал.

<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

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


Я изменил эту строку в devise.rb:

config.sign_out_via = :delete

в

config.sign_out_via = :get

и он начал работать для меня.


':method => :delete ' на странице ' data-method="delete" ', поэтому ваша страница должна иметь jquery_ujs.js, она отправит ссылку с методом delete not method get


  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end




routes