2012-03-01 12 views
7

Używam Rails 3.2 i najnowszej wersji Authlogic. Kiedy uruchomię swoją aplikację lokalnie na moim Macu, działa dobrze. Gdy próbuję uruchomić go na serwerze produkcyjnym (Ubuntu z pasażerów/Apache), otrzymuję to:Authlogic nie działa z moją aplikacją Rails 3.2

You must establish a database connection before using acts_as_authentic 

Nie jestem pewien, w jaki sposób rozwiązać ten problem. Dzisiaj opublikowałem this related question zanim zdałem sobie sprawę, że problem był szerszy, niż myślałem.

+0

Byłem wielkim fanem authlogic i miałem wiele aplikacji w erze 2.x (włączając adaptery do LDPA, RPX itp.). Od tego czasu zaktualizowałem większość z nich do wersji 3.0.x i 3.2, ale w procesie zdecydowałem, że ogólnie jest to lepsze i łatwiejsze do migracji. To proste, a kod jest czystszy (głównie dzięki temu, że został zaprojektowany w 3.0. To nie odpowiada na twoje pytanie. Po prostu wspominam o tym, więc masz to na uwadze, jeśli authlogic ciągle przegryza; przejście na programowanie nie jest tak wielką sprawą i nie zajmie Ci to dużo czasu, aby uzyskać podstawowe informacje. – tardate

+0

W końcu zamieniłem się w Devise. Była to zadziwiająco łatwa i bezbolesna zmiana. –

+0

To wydaje się być naprawione. Na razie musimy użyć 'gem 'authlogic',: git => 'git: // github.com/binarylogic/authlogic.git'' w gemfile, aby pobrać z gałęzi master. –

Odpowiedz

9

Wyjaśniałem problem. Spójrz na ten urywek z Authlogic na lib/authlogic/acts_as_authentic/base.rb:

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

Jeśli column_names zgłasza błąd, db_setup? zwróci false. Spójrz na tej drugiej funkcji, również ze 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 

Jeśli db_setup? zwraca false, Authlogic rzuci wyjątek, ale nie takie same wyjątek rzucony przez column_names.

Moim problemem było to, że column_names rzucał ten wyjątek:

/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 

A powodem tego wyjątku jest, że mój stół użytkownik nazywa user nie users, ale Rails nie zbierał się na moim pluralize_table_names prawidłowo ustalone . Po naprawieniu problemu pluralize_table_names (podobno sposób, w jaki to ustawienie zostało zmienione w Rails 3.1), mój problem z Authlogic zniknął.

Więc jeśli masz ten problem, możesz spróbować tego:

  • sklonować repo Authlogic gdzieś na komputerze dev
  • Zmień Gemfile korzystać z lokalnej wersji Authlogic ('authlogic', :path => '/path/to/authlogic')
  • Dodaj column_names wezwanie do db_setup? poza begin/rescue/end klauzuli
  • Zobacz, czy masz inny, potencjalnie m Ruda dokładna i pouczająca, błąd, tak jak ja.
+0

Co byłoby naprawdę miłe, oczywiście, jeśli Authlogic był świadomy możliwości tego problemu. Zadałem nowe pytanie z pytaniem, jak wykryć ten konkretny problem, więc mogę zastosować poprawkę do Authlogica ... zakładając, że to dobry pomysł. http://stackoverflow.com/questions/9557860/how-do-i-catch-this-specific-error-in-rails#comment12115170_9557860 –

5

Naprawiłem to na moim widelcu. Dopóki Ben nie zdąży scalić poprawki, możesz obejść to, używając stałej gałęzi w swoim Gemfile;

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

Dla każdego, kto mógł przyjść na tę stronę, szukając odpowiedzi.

Jednym z powodów może być to, że nie utworzyłeś testowej bazy danych.

Wystarczy uruchomić:

$ RAILS_ENV = test rake db: create db: migrować

Powiązane problemy