рельсы 3 надзиратель NameError (uncaught throw `warden '): - PullRequest
4 голосов
/ 17 декабря 2011

вот как это должно работать: я захожу в админ-панель, захожу в cars / new и заполняю поля, нажимаю create и у меня должна быть новая машина в моем списке. www.autozeep.com

Дело в том, что все идет нормально, пока я не нажму кнопку Создать, чтобы создать новый автомобиль, журнал сервера показывает это:

NameError (uncaught throw `warden'):
  app/controllers/application_controller.rb:9:in `login_required'
  app/middleware/flash_session_cookie_middleware.rb:17:in `call'

в режиме разработки это работает нормально, на сервере в рабочем режиме это не так, это тот же код, ничего не изменилось.для большего количества журналов сервера: http://pastie.org/3028350

application_controller

class ApplicationController < ActionController::Base
    protect_from_forgery

  # filter

  def login_required
    return true if authenticated?
    warden.authenticate!
  end

users_controller: http://pastie.org/3028586

Я могу редактировать автомобиль, он работает нормально, поэтому функции обновления и редактирования из cars_controller в порядке, я проверилновые и создаваемые функции из cars_controller, но я не смог ничего изобразить, что дало бы мне представление о том, что происходит.Cars_controller: http://pastie.org/3028452

Пожалуйста, помогите, у меня уже запущено это приложение, и клиент ждет, пока эта проблема будет решена.Спасибо всем большое.

РЕДАКТИРОВАТЬ

NameError in CarsController#create

uncaught throw `warden'

Rails.root: /u/apps/zeepauto/releases/20111123173432
Application Trace | Framework Trace | Full Trace

app/controllers/application_controller.rb:9:in `login_required'
app/middleware/flash_session_cookie_middleware.rb:17:in `call'

ENV DUMP
...
....
rack.url_scheme: "http"
rack.version: [1, 0]
warden: Warden::Proxy:-621456458 @config={:default_strategies=>{:_all=>[:database]}, :failure_app=>UsersController, :default_scope=>:default, :scope_defaults=>{}, :intercept_401=>true}
warden.options: {:attempted_path=>"/cars", :action=>"unauthenticated"}

Я получаю эти ошибки только при добавлении нового автомобиля, я могу редактировать автомобили, новости, контакты.все, кроме автомобилей.

ПРОБЛЕМА РЕШЕНА

Эта проблема была вызвана некоторой библиотекой jquery, я использую dynamic_form в этой форме, поэтому при выборе имени машины в следующем select_boxПоявляются только модели для выбранного автомобиля.Осматривая проблему (с моим учителем, я бы не думал об этом сам), мы видим, что когда я выбираю автомобиль, в журналах запускается процесс «dynamic_carmodels» для обновления списка carmodels, а также на этом этапе сеансового ключа.изменяется другим, обычно, если ключ сеанса изменяется, сеанс, который я начал, когда я вошел в систему, больше не действителен, и поэтому я получаю «ошибку без аутентификации».До сих пор не знаю, что именно вызвало проблему с помощью jquery, но, наконец, я решил эту проблему, это было не из-за конфигурации начальника.

1 Ответ

10 голосов
/ 19 декабря 2011

Хорошо, я объясню вам, почему это исключение происходит очень осторожно, но я не могу исправить это для вас.

Warden защищает ваше приложение блоком catch (: warden), вы можете увидеть это в:

# Invoke the application guarding for throw :warden.
# If this is downstream from another warden instance, don't do anything.
# :api: private
def call(env) # :nodoc:
  return @app.call(env) if env['warden'] && env['warden'].manager != self

  env['warden'] = Proxy.new(env, self)
  result = catch(:warden) do
      @app.call(env)
  end

Ваше приложение вызывается в @ app.call (env), и если ваше приложение выдает (: warden), оно перехватывается. Вот как бросить, поймать работает, вот пример:

def authenticate!()
  throw :warden
end

catch(:warden) do
  puts "Calling authenticate!" 
  authenticate!() 
end

puts "Succesfully called authenticate!"
#outside of catch(:) guard
authenticate!()
puts "this never gets executed"

Если я выполню это, он сделает:

 ruby exc.rb 
 Calling authenticate!
 Succesfully called authenticate!
 exc.rb:2:in `throw': uncaught throw :warden (ArgumentError)
    from exc.rb:2:in `initialize!'
    from exc.rb:12:in `<main>'

Как видите, во второй раз я позвонил аутентифицировать! Я был вне блока catch (: warden), поэтому, когда я бросил: warden, не было блока catch, чтобы поймать его, произошло исключение.

Это то, что происходит с вами, посмотрите на warden#authenticate!:

def authenticate!(*args)
   user, opts = _perform_authentication(*args)
   throw(:warden, opts) unless user
   user
end

Видите бросок (: смотритель, опц)? Если этот бросок находится вне блока catch (: warden), возникает исключение. Предполагается, что Warden охраняет все ваше приложение в блоке catch, чтобы вы могли бросить: warden в любой момент. Но по какой-то причине это не происходит на Zeepauto.

Ваша проблема в том, что надзиратель неправильно настроен (нет config/initializers/warden.rb) и call (env), поэтому ваш улов (: надзиратель) никогда не устанавливается.

Ваш ответ здесь: https://github.com/hassox/warden/wiki/Setup

Просто проработайте настройки самостоятельно. Вы можете проверить свою среду разработки, бросив: warden в любое время. Просто напишите тест вроде:

it "warden should catch the throw :warden at any point" do
  throw(:warden)
end

Если вы хотите получить эту вещь быстрее, просто получите профессиональный аккаунт на railscasts.com и посмотрите: http://railscasts.com/episodes/305-authentication-with-warden этот эпизод проведет вас через настройку.

...