Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

173
Views
Rails 6 antes de guardar devolución de llamada no disparada

Estoy tratando de asignar un número aleatorio a un atributo llamado position antes de que se guarden los objetos de mi Product . No puedo hacer que la devolución de llamada funcione correctamente. No hay errores en la consola, simplemente falla silenciosamente.

Aquí está mi modelo

 class Product < ApplicationRecord validates_presence_of :position before_save { assign_position } private def assign_position self.position = rand(150) end end

este es mi esquema

 create_table "products", force: :cascade do |t| t.string "name" t.integer "position" end

Aquí hay una semilla de ejemplo que estoy usando para probar la devolución de llamada antes de guardar.

 Product.create(name: "Rose Deep Hydration Facial Toner")

No hay errores, pero la salida de la consola cuando compruebo después de crear la semilla

 irb(main):079:0> Product.find_by_name("Rose Deep Hydration Facial Toner").position Product Load (1.8ms) SELECT "products".* FROM "products" WHERE "products"."name" = $1 ORDER BY "products"."created_at" DESC LIMIT $2 [["name", "Rose Deep Hydration Facial Toner"], ["LIMIT", 1]] => nil

Tengo otras devoluciones de llamada en la aplicación que funcionan bien. No puedo entender por qué este no funciona.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Su problema es que las validaciones ocurren antes de que se activen las devoluciones de llamada before_save . Tienes esto:

 validates_presence_of :position

pero la position seguirá siendo nil cuando se verifique esa validación.

Creo que desea utilizar una devolución de llamada before_validation en lugar de before_save :

 class Product < ApplicationRecord before_validation :assign_position validates_presence_of :position private def assign_position self.position = rand(150) end end

Tenga en cuenta que se assign_position a la asignación de posición cada vez que valide un Producto, por lo que actualizar un error tipográfico en el nombre (por ejemplo) cambiará la position . Es posible que desee dejar la posición en paz si ya está configurada o si está modificando una instancia existente.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!