2012-03-01 3 views
7

Я запускаю Rails 3.2 и последнюю версию Authlogic. Когда я запускаю свое приложение локально на своем Mac, он отлично работает. Когда я пытаюсь запустить его на моем рабочем сервере (Ubuntu с пассажирской/Apache), я получаю это:Authlogic не работает с моим Rails 3.2 app

You must establish a database connection before using acts_as_authentic 

Я не уверен, как устранить эту проблему. Я опубликовал вчера this related question, прежде чем понял, что проблема была шире, чем я думал.

+0

Раньше я был большим поклонником authlogic, и у меня было много приложений в эпоху 2.x (включая адаптеры для LDPA, RPX и т. Д.). С тех пор я обновил большинство из них до 3.0.x и 3.2, но в процессе решил, что в целом его лучше и легче переносить, чтобы разработать. Это легко, и код чище (как правило, из-за того, что он был разработан в эпоху 3.0). Это не отвечает на ваш вопрос. Я просто упоминаю об этом, поэтому вы помните об этом, если authlogic продолжает откусывать; переход на разработку не является таким большим делом, и вам не понадобится много времени, чтобы получить основы. – tardate

+0

В конце концов я перешел на Devise на другой день. Это был удивительно простой и безболезненный переключатель. –

+0

Это кажется исправленным. На данный момент нам нужно использовать 'gem 'authlogic',: git => 'git: // github.com/binarylogic/authlogic.git'' в gemfile, чтобы вытащить из ведущей ветки. –

ответ

9

Я понял проблему. Посмотрите на этот отрывок из Authlogic-х lib/authlogic/acts_as_authentic/base.rb:

private 
     def db_setup? 
     begin 
      column_names 
      true 
     rescue Exception 
      false 
     end 
     end 

Если column_names выдает ошибку, db_setup? вернет ложь. Посмотрите на эту другую функцию, а также от base.rb:

def acts_as_authentic(unsupported_options = nil, &block) 
     # Stop all configuration if the DB is not set up 
     raise StandardError.new("You must establish a database connection before using acts_as_authentic") if !db_setup? 

     raise ArgumentError.new("You are using the old v1.X.X configuration method for Authlogic. Instead of " + 
     "passing a hash of configuration options to acts_as_authentic, pass a block: acts_as_authentic { |c| c.my_option = my_value }") if !unsupported_options.nil? 

     yield self if block_given? 
     acts_as_authentic_modules.each { |mod| include mod } 
    end 

Если db_setup? возвращает ложь, Authlogic сгенерирует исключение, , но не то же самое исключение, брошенную column_names.

Моя проблема заключалась в том, что column_names бросает это исключение:

/Users/jason/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1106:in `async_exec': PG::Error: ERROR: relation "users" does not exist (ActiveRecord::StatementInvalid) 
LINE 4:    WHERE a.attrelid = '"users"'::regclass 
             ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
       ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
      WHERE a.attrelid = '"users"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
      ORDER BY a.attnum 

И причина этого исключения в том, что моя пользовательская таблица называется user, не users, но Rails не поднимала на моем pluralize_table_names настройки правильно , Как только я исправил свою проблему pluralize_table_names (очевидно, что этот параметр работает, был изменен в Rails 3.1), моя проблема с Authlogic исчезла.

Так что, если вы с этой проблемой, вы можете попробовать это:

  • Clone репо Authlogic где-то на вашем Dev машине
  • Измени Gemfile использовать локальную версию Authlogic ('authlogic', :path => '/path/to/authlogic')
  • Добавить column_names вызов db_setup? вне пункта
  • в begin/rescue/end Смотрите, если вы получите другие, потенциально м руд точный и информативный, ошибка, как я сделал
+0

Что было бы действительно приятно, конечно, если Authlogic знал о возможности этой проблемы. Я задал новый вопрос, как определить эту проблему, чтобы я мог применить патч к Authlogic ... предполагая, что это хорошая идея. http://stackoverflow.com/questions/9557860/how-do-i-catch-this-specific-error-in-rails#comment12115170_9557860 –

5

Я исправил это на своей вилке. Пока Бен не успеет объединить исправление, вы можете обойти это, используя фиксированную ветвь в своем Gemfile;

gem 'authlogic', :git => '[email protected]:james2m/authlogic.git', :branch => 'fix-migrations' 
4

Для всех, кто, возможно, пришел на эту страницу, ища ответа.

Одна из причин может заключаться в том, что вы не создали свою тестовую базу данных.

Просто запустите:

$ RAILS_ENV = тест грабли БД: создать БД: мигрировать

Смежные вопросы