Rails: ошибка действия в производстве, но не в разработке

Может ли кто-нибудь объяснить, почему я продолжаю получать ошибку в производстве, но не в разработке? Соответствующие части:

get: /user/logout
ActionController::RoutingError (uninitialized constant User::SessionController):
  activesupport/lib/active_support/inflector/methods.rb:229:in `block in constantize'
  activesupport/lib/active_support/inflector/methods.rb:228:in `each'
  activesupport/lib/active_support/inflector/methods.rb:228:in `constantize'
  actionpack/lib/action_dispatch/routing/route_set.rb:69:in `controller_reference'
  actionpack/lib/action_dispatch/routing/route_set.rb:54:in `controller'
  actionpack/lib/action_dispatch/routing/route_set.rb:32:in `call'
  journey/lib/journey/router.rb:68:in `block in call'
  journey/lib/journey/router.rb:56:in `each'
  journey/lib/journey/router.rb:56:in `call'
  actionpack/lib/action_dispatch/routing /route_set.rb:600:in `call'
  omniauth/lib/omniauth/strategy.rb:177:in `call!'
  omniauth/lib/omniauth/strategy.rb:157:in `call'
  omniauth/lib/omniauth/builder.rb:48:in `call'
  airbrake/lib/airbrake/rack.rb:27:in `call'

Маршруты:

Application1::Application.routes.draw do
  match('/auth/:provider/callback' => 'session#create', :format => false)
  root(:to => 'blog/archives#index', :format => false)

  namespace(:user) do
    match('/logout' => 'session#destroy', :format => false)
  end 

  namespace(:blog) do
    match('/archive/:slug' => 'archive#show', :format => false)
    constraints(:page => /page\d+/) do
      match('/archives/:page' => 'archives#index', :format => false)
    end 
  end 
end

Я использую Rails 3.2.3 с последней версией Omniauth.


person Jordon Bedwell    schedule 21.04.2012    source источник


Ответы (1)


Вы создали пространство имен user и поэтому должны поместить контроллер session, определяющий действие destroy, по этому пути:

/app/controllers/user/session_controller.rb

Затем вы можете делать такие вещи, как:

Создайте файл в /app/controller/user/base_controller.rb, определяющий это:

class User::BaseController < ApplicationController
 # Whatever you want here
end

И определите контроллер сеансов, расположенный в /app/controllers/user/session_controller.rb, как:

class Users::SessionsController < User::BaseController
 def destroy
  # whatever you want destroy to do..
 end
end

Прочитайте эту дополнительную документацию о пространствах имен и маршрутизации.

person Nobita    schedule 21.04.2012
comment
Сессия — это самостоятельный контроллер с общедоступными интерфейсами /usr/logout => session#destroy и /auth/, идущими к session#create. Я не хочу разбивать общий (общий) контроллер на части, усложняющие управление. Я могу сопоставить его непосредственно с session#destroy за пределами пространства имен, но внутри он ожидает того, что вы указываете, чего я не хочу, поскольку это означает, что когда я заканчиваю добавлять остальную часть /user/, у меня есть один маршрут внутри /user вне пространства имен. Кроме того, документация, на которую вы указали, довольно широка и требует объяснений относительно :namespaces и моей проблемы. - person Jordon Bedwell; 21.04.2012