Приложение Rails не может найти 'destroy_user_session_path' в JavaScript - PullRequest
2 голосов
/ 12 февраля 2012

У меня есть приложение rails, которое было перенесено за годы с 2.2 до 3.2. Я использую Devise и Omniauth для работы логинов, к сожалению, я думаю, что во время миграции я что-то напутал.

Когда я пытаюсь настроить удаление сеанса в application.html.erb, я получаю следующую ошибку:

undefined local variable or method `destroy_user_session_path' for #<#<Class:0xb468e278>:0xb423e1dc>

application.html.erb:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Coffee Tracker</title>
  <%= stylesheet_link_tag 'application'%>
  <!--%= stylesheet_link_tag 'scaffold' %-->
</head>
<!--%= javascript_include_tag :defaults %-->
<%= javascript_include_tag 'application' %>
<%= csrf_meta_tag %>
...snip...
<% if user_signed_in? %>
  <span id="currentuser"><%= current_user.email %></span>
  <%= link_to('Logout', destroy_user_session_path, :method => 'delete') %>
<% else %>

Я также получаю ту же ошибку при попытке строки:

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

application.js

// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
//= require_self
//= require_tree .
//= require jquery
//= require jquery_ujs

Rails 3.2.0 ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux]

  • рельсы (3.2.0)
  • jquery-рельсы (2.0.0)
  • devise (2.0.0)
  • omniauth (1.0.2)
  • omniauth-facebook (1.2.0)
  • omniauth-oauth2 (1.0.0)

Обновление: Вот грабли маршрутов:

user_omniauth_callback     /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:facebook)
           coffee_list GET /coffee/list(.:format)                 coffee#list
                  root     /                                      menu#index
                           /:controller(/:action(/:id(.:format))) :controller#:action

Ответы [ 4 ]

6 голосов
/ 06 мая 2014

Если вы хотите использовать omniauthable без database_authenticatable, вам нужно будет добавить маршрут вручную.

В routes.rb:

devise_scope :user do
  delete "/users/sign_out" => "devise/sessions#destroy"
end

Тогда, на ваш взгляд:

= link_to "Sign out", users_sign_out_path, :method => :delete

Для получения дополнительной информации см. Эти учебники Omniauth для Facebook и Twitter:

Почему мы должны это делать?См. Обоснование Хосе Валима здесь:

3 голосов
/ 13 февраля 2012

Мне не хватало модуля devisableable базы данных, который добавляет маршрут.

приложение / модели / user.rb:

 devise :omniauthable, :database_authenticatable

маршруты рейка:

      new_user_session GET    /users/sign_in(.:format)               devise/sessions#new
          user_session POST   /users/sign_in(.:format)               devise/sessions#create
  destroy_user_session DELETE /users/sign_out(.:format)              devise/sessions#destroy
user_omniauth_callback        /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:facebook)
           coffee_list GET    /coffee/list(.:format)                 coffee#list
                  root        /                                      menu#index
                              /:controller(/:action(/:id(.:format))) :controller#:action

Я нашел документацию, подтверждающую, что модули, использующие аутентифицируемые, создают эти маршруты в документации devise_for: http://rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper#devise_for-instance_method

2 голосов
/ 13 февраля 2012

У вас есть два решения:

  1. Добавить: method =>: delete к ссылке_to
  2. Или в файле devise.rb изменить строку config.sign_out_via=: удалить в config.sign_out_via =: получить
1 голос
/ 12 февраля 2012
user_session_path(current_user), :method => :delete

Моя рекомендация, если у вас нет определенного имени маршрута "destroy"

...