Dans un contexte de modèles imbriqués et de champs de formulaire, lors de la création du parent et de la valeur d'un enfant, l'objectif est d'appliquer une condition à la valeur de l'enfant pour déterminer une valeur subséquente (product_id), le tout dans la création d'une action mèreattribut de mise à jour après création de la condition suivante appliquée à un autre attribut
class QuoteItem < ActiveRecord::Base
belongs_to :quote, :inverse_of => :quote_items
belongs_to :product
class Quote < ActiveRecord::Base
has_many :quote_items, :inverse_of => :quote
Cela ne peut pas être exécuté en tant que méthode de modèle au préalable, comme le modèle n'a aucune idée de params. Une tentative de définir un rappel after_create pour QuoteItem
after_create :set_product
def set_product
@quote_item.product_id = Product.where(['min <= ? AND max >= ?', @quote_item.size, @quote_item.size]).first.select[:id]
end
ne pas enregistrer l'identifiant du produit.
Une manière plus succincte pourrait être de recharger les données via le contrôleur. Sur l'action créer
respond_to do |format|
if @quote_item.save
set_product
@quote_item.update_attribute([:quote_item][:product_id])
format.html { redirect_to @quote_item, notice: 'Quote item was successfully created.' }
avec un résultat NIL identique
action faite dans 'after_create' ne sont pas persisté – Ven
OK. Le travail avant la sauvegarde et après la commande create est toujours ignoré: ----- def create bim = Product.where (['min <=? ET max> =?', Params [: quote_item] [: size ], params [: quote_item] [: size]]). premier params [: quote_item] [: size] = bim @quote_item = QuoteItem.new (params [: quote_item]) – Jerome