ruby-on-rails - code_challenge - rails api authentication
La relación de error indefinible PG no existe (18)
Veo esta pregunta antes, pero solo para rspec. Todavía no estoy creando una prueba porque es demasiado avanzado para mí, pero un día, ¡pronto lo haré! :PAG
Recibo este error cuando intento registrarme / iniciar sesión con mi aplicación. No estoy seguro de dónde buscar para solucionarlo. Utilizo el diseño para crear mi usuario y también omniauth2 para iniciar sesión con google .
este es el error
ActiveRecord::StatementInvalid at /users/auth/google_oauth2/callback
PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 5: WHERE a.attrelid = ''"users"''::regclass
^
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
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
Intenté rake db:migrate
, pero ya está creado, en la tabla de esquema existen usuarios. ¿Alguien ha recibido este error antes?
database.yml
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem ''pg''
#
development:
adapter: postgresql
encoding: unicode
database: tt_intraweb_development
pool: 5
username: my_username
password:
# Connect on a TCP socket. Omitted by default since the client uses a
# domain socket that doesn''t need configuration. Windows does not have
# domain sockets, so uncomment these lines.
#host: localhost
#port: 5432
# Schema search path. The server defaults to $user,public
#schema_search_path: myapp,sharedapp,public
# Minimum log levels, in increasing order:
# debug5, debug4, debug3, debug2, debug1,
# log, notice, warning, error, fatal, and panic
# The server defaults to notice.
#min_messages: warning
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
adapter: postgresql
encoding: unicode
database: tt_intraweb_test
pool: 5
username: my_username
password:
production:
adapter: postgresql
encoding: unicode
database: tt_intraweb_production
pool: 5
username: my_username
password:
¡Gracias!
(Sé que esto es viejo, pero para futuros googlers)
¿Estás usando un devise
? Sé específicamente que omniauthable
es un problema, pero tal vez otros también. No tiene que ser devise
sin embargo. Genéricamente la solución es comentar el modelo ofensivo, clase, lo que sea, y dejar de comentar las secciones que los errores piden.
Para mí, lo que devise
es que el devise
es leer el modelo de User
para ver lo que tienes como argumentos para devise
(el método de la clase es decir, devise :database_authenticatable, :registerable #etc
)
Pero, leerá todo el archivo y, si no es un proyecto nuevo, podría estropearse con otros métodos de clase que dependen de otras cosas (en mi caso, se trataba de la gema friendly_id
, y luego un alias_method
La respuesta fue comentar el modelo de User
excepción de las líneas de devise
* y rake db:schema:load
debería funcionar bien.
de lo contrario, recibí este error:
ArgumentError: asignando omniauth_callbacks en un recurso que no es omniauthable. Por favor, agregue el
devise :omniauthable
al modelo deUser
Al principio, deberá separar todas las conexiones de la base de datos. Por defecto, usa el entorno de desarrollo . Luego intente restablecer la base de datos con lo siguiente:
rake db:reset
La tarea rake db: reset soltará la base de datos y la configurará de nuevo. Esto es funcionalmente equivalente a rake db: drop db: setup.
Esto no es lo mismo que ejecutar todas las migraciones. Solo usará el contenido del archivo schema.rb actual. Si no se puede deshacer una migración, rake db: reset puede no serle útil. Para obtener más información sobre cómo deshacerse del esquema, consulte la sección Esquema del esquema y Usted. Documentos de Rails
Si el truco no ayuda, suelte la base de datos, vuelva a crearla de nuevo, migre datos, y si tiene semillas, siembre la base de datos:
rake db:drop db:create db:migrate db:seed
o en pocas palabras (desde 3.2):
rake db:migrate:reset db:seed
Dado que db:migrate:reset
implica drop, crea y migra el db. Debido a que el entorno predeterminado para rake
es el desarrollo , en caso de que vea la excepción en las pruebas de especificación, debe volver a crear db para el entorno de prueba de la siguiente manera:
RAILS_ENV=test rake db:drop db:create db:migrate
o con solo cargar el esquema migrado:
RAILS_ENV=test rake db:drop db:create db:schema:load
En la mayoría de los casos, la base de datos de prueba se está sembrando durante los procedimientos de prueba, por lo que no es necesario pasar la acción de la tarea db:seed
. De lo contrario, deberá preparar la base de datos (esto está desaprobado en Rails 4 ):
rake db:test:prepare
y luego (si realmente se requiere):
RAILS_ENV=test rake db:seed
En mi caso, tuve que comentar 2 archivos de ActiveAdmin
. Aquí estaban mis pasos:
- Error inicial / stacktrace (tenga en cuenta que estamos utilizando
Solr
en este proyecto):⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = ''"discussions"''::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = ''"discussions"''::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in
block in <top (required)>'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in
'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:inblock in <top (required)>'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in
'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in `'' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = ''"discussions"''::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = ''"discussions"''::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in
block in <top (required)>'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in
'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:inblock in <top (required)>'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in
'' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in `'' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)
Comenté el archivo app/admin/discussions.rb
según la respuesta de Arcolye anterior e intenté migrar mi base de datos nuevamente.
Mismo error.
Miré la stacktrace un poco más de cerca, y noté que de hecho app/admin/users.rb:25
lanzaba la excepción, y por supuesto, ese archivo tiene una dependencia en mi tabla de discussions
(mediante la ejecución de Discussion.all
).
Finalmente, comentar los contenidos de users.rb
me permitió finalmente migrar mi base de datos con éxito.
FYI: hay una discusión here en ActiveAdmin
sobre si esa gema debe cargar la base de datos cuando sea necesario.
Entonces teniendo el mismo problema ahora. Recuerde tener solo un modelo en cada migración. Eso lo resolvió para mí.
Ese problema para mí fue causado por los rieles de Factory Girl. Recomendaría a quienes lo usan cambiar el nombre de la carpeta de especificaciones / fábricas a especificaciones / temperatura e intentar
RAILS_ENV = your_environment bundle exec rake db: migrate --trace
Si pasa, entonces acaba de encontrar lo que estaba causando. Un vistazo rápido a la gema de Factory Girl Rails gem github me ayudó a identificar el problema.
¡Las fábricas estaban fallando porque estaba intentando crear una instancia de un Modelo que no existía al correr! Ejemplo de código a continuación:
FactoryGirl.define do
factory :billing_product, class: ''Billing::Product'' do
name Faker::Cat.name
product_type ''fuel''
active true
payment_options [Billing::PaymentOption.new(term: 1, payment_term: 1)]
end
end
Encapsular la matriz en un bloque (agregando {}) fue la solución para mí. Tenga en cuenta que payment_options puede tomar más de una opción de pago en el ejemplo ...
payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}
Consulte la parte de Atributos dinámicos de los documentos de Factory Girl Rails para obtener más información.
¡No olvide cambiar el nombre de su carpeta de fábricas!
Estaba teniendo el siguiente error y haciendo una búsqueda en todo el código de mi aplicación para type_zones
no type_zones
encontrarlo. También miré el db y se actualizó.
Resulta que era un archivo en los accesorios /test/fixtures/type_zones.yml
que causaba el problema.
ERROR["test_should_get_new", UsersControllerTest, 0.47265757399145514]
test_should_get_new#UsersControllerTest (0.47s)
ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "type_zones" does not exist
LINE 1: DELETE FROM "type_zones"
^
: DELETE FROM "type_zones"
Esto a menudo es causado por un error en ActiveAdmin. A continuación, se explica cómo solucionar el error:
Si está usando ActiveAdmin, cualquiera que sea la tabla que PG dice que no existe, comente los contenidos de ese archivo ActiveAdmin rb.
Por ejemplo, para este caso PGError: ERROR: relation "users" does not exist
, comente todo el contenido de la app/admin/users.rb
, luego descomente después de que haya realizado sus migraciones.
La causa más probable es que su rake usa un entorno diferente de database.yml que su servidor web.
Me encuentro con este error y sobre mi investigación uno de los motivos de la relación de error indefinible de PG es que los usuarios no existen .
Este error es un error de migración. Es posible que haya creado un nuevo modelo con algunos atributos de base de datos. Después de crear el modelo, debe migrar los atributos al esquema de su aplicación de rieles.
Si está utilizando la máquina local para el desarrollo, puede usar el comando
rake db:migrate
Si estás usando heroku
heroku run rake db:migrate
Obtuve este error también al ejecutar rspec:
Failure/Error: it { expect(subject.priority_list).to eq [nil] * 9 }
ActiveRecord::StatementInvalid:
PG::UndefinedTable: ERROR: relation "priorities" does not exist
LINE 5: WHERE a.attrelid = ''"priorities"''::regclass
...
Fue resuelto para mí después de que corrí
rake db:test:prepare
rake db:test:load
Obtuve un error similar al intentar ejecutar pruebas con rspec.
Seguí los pasos de Малъ Скрылевъ pero seguí corto. El último paso que tuve que hacer fue cargar mi esquema en mi base de datos de prueba usando:
RAILS_ENV=test rake db:schema:load
Después de eso, el problema desapareció y pude pasar al siguiente error. Espero que eso te de una idea.
Para cualquiera que todavía tenga este problema, en mi fábrica de FactoryGirl estaba activando este error.
Intentaba agregar una referencia a través de ''.new'' o ''.create''.
Retire la carpeta Admin y ejecute rake nuevamente.
Su base de datos de prueba no está lista para rspec.
Prepare su base de datos de prueba para rspec para corregir este error
RAILS_ENV=test rake test:prepare
Soltará, creará y agregará migraciones a su base de datos de prueba
En caso de que la tarea de rake se interrumpa con un mensaje como ''PG :: Error: ERROR: base de datos'' ''[your_db_test]'' se está accediendo por otros usuarios ''ejecute éste
RAILS_ENV=test rake db:migrate
Tuve este problema después de eliminar la tabla de usuarios. las soluciones estaban cambiando
change_table(:users)
a
create_table(:users)
Tuve este problema y resultó ser causado por Grape API . Noté en el seguimiento de la pila que el archivo de rutas se estaba leyendo durante la migración.
En routes.rb se monta la api de uva
mount API::Base => ''/''
Y en la API se hicieron referencias al modelo faltante. Entonces, gracias a esta respuesta , la coloqué en un bloque que detecta si la está ejecutando el servidor o durante la migración.
unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
mount API::Base => ''/''
end
Y funcionó.
Tuve un error similar. La raíz de mi error fue que tenía una referencia a un modelo de Rails en mi archivo factoryies.rb. Entonces causó un problema de error de carga. La solución era envolver la referencia en un bloque o {}
para que retrase su ejecución.
Aquí estaba el código BROKEN:
FactoryGirl.define do
factory :user do
guid User.new.send(:new_token)
end
end
Y estaba cometiendo un error porque el User
no estaba definido cuando se estaba cargando el archivo factories.rb. Envolví la llamada User.new
en un bloque y resolvió el problema:
Código fijo:
FactoryGirl.define do
factory :user do
guid { User.new.send(:new_token) }
end
end
Nota: probablemente no es una buena práctica que necesite llamar a su modelo de esta manera, pero fue una solución para SECAR mi código.
::Migration[5.0]
faltaba en las migraciones. en lugar de lanzar un error de sintaxis , lanza
PG :: IndefinidoTable: ERROR: roles de relación no existe
después de perder horas, finalmente descubrí que falta la ::Migration[5.0]
.
Migración Errónea:
class CreateRoles < ActiveRecord # <---- Pay attention
def change
create_table :roles do |t|
t.string :name
t.integer :code, limit: 2
t.boolean :is_active, default: true
t.timestamps
end
end
end
Corrección y corrección de la migración
class CreateRoles < ActiveRecord::Migration[5.0]
def change
create_table :roles do |t|
t.string :name
t.integer :code, limit: 2
t.boolean :is_active, default: true
t.timestamps
end
end
end
Esto podría ser un error con los rieles y podría ayudar a alguien, en lugar de luchar y preguntarse.