J'aimerais que ActiveRecord définisse automatiquement un champ de base de données utilisant des rappels. in ./script/console I Do P> p = Product.create
p
3 Réponses :
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
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 i> 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 () code> ne déclenche pas
après_create () code>?
Qu'est-ce que Joey dit est que After_Create ne fonctionnera pas. P>
utiliser avant_create p>
Utiliser avant_create code> pour définir les valeurs par défaut. N'oubliez pas:
After_Create code> est tiré après em> la sauvegarde dans la base de données. Utilisation de
After_Create code> Initialiser uniquement les valeurs en mémoire et nécessitera additionnez em> sauvegarder pour commettre les valeurs initialisées à la base de données. P>
Le produit le plus probable.Create échoue, donc
après_create code> n'est pas appelé. Jetez un coup d'œil à
p.errors code>