6
votes

Rails: Définition de l'attribut dans After_Create

J'aimerais que ActiveRecord définisse automatiquement un champ de base de données utilisant des rappels. XXX PRE>

in ./script/console I Do P>

p = Product.create
p


1 commentaires

Le produit le plus probable.Create échoue, donc après_create n'est pas appelé. Jetez un coup d'œil à p.errors


3 Réponses :


10
votes

avant_create est appelé avant BASE.SAVE , puisque votre ne pas sauvegarder son appelé.

Edit: P> xxx pré>

avec ceci dans votre contrôleur fonctionnera comment vous voulez. P>

@product = Product.create # before_create will be called and locale will be set for the new product


5 commentaires

Vous devez appeler Save pour que le rappel soit appelé si vous avez mis avant_create ou après_create. Avant_Create est ce que vous recherchez, mais vous devez appeler à faire quoi que ce soit.


Cette réponse est fausse. ActiveRecord :: base.create déclenchera un appel de sauvegarde et appelera à nouveau la sauvegarde ne résoudra pas le problème.


Tout le point d'Actionecord :: base.create est d'instancier et d'économiser un modèle.


Avant_create peut également être utilisé pour définir d'autres champs non collectés sur la forme initiale. Par exemple, j'ai aidé à écrire une implémentation OAuth à l'aide de Devise et Omniauth pour s'intégrer à une plate-forme existante. Devise ajoute le champ de nom d'utilisateur au schéma DB utilisateur et nous définissons ce champ avant d'enregistrer le nouvel utilisateur avec l'adresse e-mail de l'utilisateur.


@Joey pourriez-vous corriger votre réponse et votre commentaire concernant appeler créer () ne déclenche pas après_create () ?



2
votes

Qu'est-ce que Joey dit est que After_Create ne fonctionnera pas.

utiliser avant_create


0 commentaires

4
votes

Utiliser avant_create pour définir les valeurs par défaut. N'oubliez pas: After_Create est tiré après la sauvegarde dans la base de données. Utilisation de After_Create Initialiser uniquement les valeurs en mémoire et nécessitera additionnez sauvegarder pour commettre les valeurs initialisées à la base de données.


0 commentaires