2012-03-01 18 views
7

Estoy ejecutando Rails 3.2 y la última versión de Authlogic. Cuando ejecuto mi aplicación localmente en mi Mac, funciona bien. Cuando trato de ejecutarlo en mi servidor de producción (Ubuntu con pasajeros/Apache), me sale esto:Authlogic no funciona con mi aplicación Rails 3.2

You must establish a database connection before using acts_as_authentic 

No estoy seguro de cómo solucionar el problema. Publiqué this related question hoy antes de darme cuenta de que el problema era más amplio de lo que pensaba.

+0

Solía ​​ser un gran fan de Authlogic y tenía muchas aplicaciones en la era 2.x que lo usaba (incluidos los adaptadores para LDPA, RPX, etc.). Desde entonces, he actualizado la mayoría de estos a 3.0.xy 3.2, pero en el proceso decidí que, en general, es mejor y más fácil migrar para diseñar. Es fácil, y el código es más limpio (generalmente debido a haber sido diseñado en la era 3.0). Esto no responde a tu pregunta. Solo lo menciono para que lo tengas en cuenta si authlogic sigue mordiendo; cambiar de idea no es tan importante, y no te tomará mucho tiempo conseguir lo básico en su lugar. – tardate

+0

Finalmente terminé cambiando a Devise el otro día. Fue un cambio asombrosamente fácil e indoloro. –

+0

Esto parece ser reparado. Por ahora tenemos que usar 'gem 'authlogic',: git => 'git: // github.com/binarylogic/authlogic.git'' en el archivo gem para extraer de la rama principal. –

Respuesta

9

Descubrí el problema. Mira este fragmento de Authlogic de lib/authlogic/acts_as_authentic/base.rb:

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

Si column_names genera un error, db_setup? volverá falsa. Mira esta otra función, también de 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 

Si db_setup? vuelve falsa, Authlogic arrojará una excepción, pero no la misma excepción lanzada por column_names.

Mi problema era que column_names estaba lanzando esta excepción:

/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 

Y la razón de esta excepción es que mi tabla de usuario se llama user, no users, pero los carriles no se den cuenta de mi pluralize_table_names configurar en forma adecuada . Una vez que arreglé mi problema pluralize_table_names (al parecer, la forma en que funciona esta configuración se ha cambiado en Rails 3.1), mi problema Authlogic desapareció.

Así que si usted está teniendo este problema, es posible que desee probar esto:

  • Clonar el repositorio Authlogic a algún lugar en su máquina dev
  • Cambiar el Gemfile utilizar la versión local de Authlogic ('authlogic', :path => '/path/to/authlogic')
  • añadir una llamada a column_namesdb_setup? fuera de la cláusula begin/rescue/end
  • ver si le da una forma diferente, potencialmente m mineral exacto e informativo, error, como lo hice
+0

Lo que sería realmente bueno, por supuesto, es si Authlogic conocía la posibilidad de este problema. Publiqué una nueva pregunta sobre cómo detectar este problema en particular para poder aplicar un parche a Authlogic ... suponiendo que sea una buena idea. http://stackoverflow.com/questions/9557860/how-do-i-catch-the-specific-error-in-rails#comment12115170_9557860 –

5

Lo he arreglado en mi tenedor. Hasta que Ben tenga tiempo de fusionar la solución, puede solucionar esto utilizando la rama fija en su Gemfile;

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

Para cualquier otra persona que haya venido a esta página en busca de una respuesta.

Una razón podría ser que no ha creado su base de datos de prueba.

Sólo tiene que ejecutar:

$ RAILS_ENV = prueba rake db: crear db: migrate

Cuestiones relacionadas