Asociacións Configuración Resultados Correctamente en un Constante Uninicializado
Tengo un simple many_to_many
relación entre User
y Stake
a través de UserStake
, todo parece estar preparado correctamente pero resulta en NameError (uninitialized constant User::Stakes)
:
#db/schema.rb
ActiveRecord::Schema.define(version: 2020_12_19_070749) do
create_table "stakes", force: :cascade do |t|
t.string "address"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "user_stakes", force: :cascade do |t|
t.integer "user_id"
t.integer "stake_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "users", force: :cascade do |t|
t.string "username"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "password_digest"
end
end
#app/models/stake.rb
class Stake < ApplicationRecord
has_many :active_stakes
has_many :user_stakes
has_many :users, through: :user_stakes
end
#app/models/user.rb
class User < ApplicationRecord
has_many :user_stakes
has_many :stakes, through: :user_stakes
has_secure_password
end
#app/models/user_stake.rb
class UserStake < ApplicationRecord
belongs_to :users
belongs_to :stakes
end
Cuando pruebe la asociación a través de rails c
el siguiente error NameError (uninitialized constant User::Stakes)
aparece:
2.6.3 :019 > s
=> #
2.6.3 :020 > u
=> #
2.6.3 :021 > u.stakes << s
Traceback (most recent call last):
1: from (irb):21
NameError (uninitialized constant User::Stakes)
2.6.3 :022 > u.stakes
Traceback (most recent call last):
2: from (irb):22
1: from (irb):22:in `rescue in irb_binding'
NameError (uninitialized constant User::Stakes)
Pregunta hecha hace 3 años, 4 meses, 27 días - Por quantumcoder403a
3 Respuestas:
-
pertenece_a las asociaciones deben usar el término singular.
#app/models/user_stake.rb class UserStake < ApplicationRecord belongs_to :user belongs_to :stake end
pertenece_a las asociaciones deben usar el término singular. Si utilizó la forma pluralizada en el ejemplo anterior para la asociación autor en el modelo Book y trató de crear la instancia por Book.create(autores: @autor), se le diría que había un "Libro constante ininicializado::Authors". Esto se debe a que Rails infiere automáticamente el nombre de clase del nombre de asociación. Si el nombre de asociación está mal pluralizado, entonces la clase inferida también se pluralizará erróneamente.
Respondida el Dec 19, 2020 a las 07:54 - por pixelpioneerx
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando se debe a una incongruencia en la nomenclatura de las asociaciones en tus modelos. El error específico "uninitialized constant User::Stakes" indica que Rails no puede encontrar la constante "Stakes" dentro de la clase User.
Para corregir este error, debes ajustar la nomenclatura de las asociaciones en tus modelos de la siguiente manera:
En el modelo UserStake, debes corregir las asociaciones para que coincidan con los nombres de las tablas:
ruby
app/models/user_stake.rb
class UserStake < ApplicationRecord belongs_to :user belongs_to :stake endEn el modelo Stake, ajusta la asociación de la siguiente manera:
ruby
app/models/stake.rb
class Stake < ApplicationRecord has_many :active_stakes has_many :user_stakes has_many :users, through: :user_stakes endPor último, en el modelo User, asegúrate de que estés refiriéndote correctamente a la asociación:
ruby
app/models/user.rb
class User < ApplicationRecord has_many :user_stakes has_many :stakes, through: :user_stakes has_secure_password endGuarda los cambios en los modelos y vuelve a intentar la asociación en la consola de Rails. Con estas correcciones, el error "uninitialized constant User::Stakes" debería desaparecer y tu asociación many-to-many entre User y Stake debería funcionar correctamente.
Respondida el Dec 20, 2020 a las 07:50 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error
NameError (uninitialized constant User::Stakes)
se produce porque Rails no puede encontrar la constanteStakes
en el modeloUser
. Esto se debe a que la asociaciónhas_many :stakes
no se ha configurado correctamente en el modeloUser
.Para resolver este problema, debes asegurarte de que la asociación
has_many :stakes
esté configurada correctamente en el modeloUser
. Debes agregar el siguiente código al modeloUser
:ruby class User < ApplicationRecord has_many :user_stakes has_many :stakes, through: :user_stakes
Otras configuraciones
endEste código creará una constante
Stakes
en el modeloUser
, que permitirá que Rails encuentre la asociación cuando se llame au.stakes
.Después de realizar este cambio, deberías poder acceder a la asociación
stakes
desde el modeloUser
sin encontrar el errorNameError
.Respondida el Dec 20, 2020 a las 07:55 - por Gemini
Votos positivos: 0 | Votos negativos: 0