Comment remplacer la “nouvelle” méthode pour rails modèle
Dans mon application rails, j'ai un modèle avec une date_debut et end_date. Si l'utilisateur sélectionne le 1er janvier 2010 la date_debut et 5 janvier 2010 la end_date, je veux qu'il y ait 5 cas de mon modèle créé (un pour chaque jour sélectionné). Donc ça va ressembler à quelque chose comme
Jan 1, 2010
Jan 2, 2010
Jan 3, 2010
Jan 4, 2010
Jan 5, 2010
Je connais une façon de gérer cela est de faire une boucle dans le contrôleur. Quelque chose comme...
# ...inside controller
start_date.upto(end_date) { my_model.new(params[:my_model]) }
Cependant, je veux garder mon contrôleur maigre, plus je veux garder la logique du modèle en dehors d'elle. Je suppose que j'ai besoin de remplacer la "nouvelle" méthode dans le modèle. Quelle est la meilleure façon de le faire?
Pourquoi voulez-vous?
J'ai un formulaire que l'utilisateur remplit pour créer un modèle. Mais cette forme est juste un squelette pour remplir les détails de mon modèle. La forme a des détails comme le "début" et "fin" des points. Pour créer un modèle, il doit les points start et end rempli. Je peux le faire dans le contrôleur, mais je suppose que ce type de logique devrait aller dans le modèle.
J'ai un formulaire que l'utilisateur remplit pour créer un modèle. Mais cette forme est juste un squelette pour remplir les détails de mon modèle. La forme a des détails comme le "début" et "fin" des points. Pour créer un modèle, il doit les points start et end rempli. Je peux le faire dans le contrôleur, mais je suppose que ce type de logique devrait aller dans le modèle.
OriginalL'auteur Lan | 2010-12-07
Vous devez vous connecter pour publier un commentaire.
@Brad dit, vous ne voulez certainement pas à remplacer les initialiser. Bien que vous pourriez remplacer after_initialize, qui n'a pas vraiment ressembler à ce que vous voulez ici. Au lieu de cela, vous voudrez probablement ajouter une méthode à la classe comme @Pâtes suggère. Afin de l'ajouter à votre modèle:
Puis l'ajouter à votre contrôleur:
OriginalL'auteur Trotter
Ne pas remplacer
initialize
Il pourrait peut-elle casser beaucoup de choses dans vos modèles. SI nous savions pourquoi vous avez besoin de nous pourrait permettre de mieux ( ne pas bien comprendre votre explication de la forme d'un squelette, vous voulez les attributs de forme pour créer d'autres attributs?? voir ci-dessous). J'utilise souvent un crochet comme Marcel suggéré. Mais si vous voulez tout le temps, pas juste avant de créer ou de sauvegarder un objet, utilisez laafter_initialize
crochet.Aussi, si vous êtes simplement à la recherche pour certaines valeurs par défaut vous pouvez fournir par défaut accesseurs, quelque chose comme: (où
some_attribute
correspond à la colonne nom de votre modèle d'attribut)ou un écrivain
Si je comprends bien votre commentaire correctement, il semble que vous exposez une forme qui permettrait de rendre votre modèle incomplet, avec les autres attributs basés sur des parties de ce formulaire? Dans ce cas, vous pouvez utiliser l'une des méthodes ci-dessus
after_initialize
ousome_attribute=
à créer d'autres attributs de votre modèle.Notez que dans les Rails 3.2.x, les touches de
attributes
sont des chaînes de caractères, par opposition à des symboles. De sorte que vous devezattributes["some_attribute"]
ci-dessus.Il n'y a aucune raison de ne pas remplacer les initialiser. Contraire, si vous regardez dans les rails de code source, vous l'aurez compris, initialiser était destinée à être substituée. Tout ce que vous devez faire est d'appeler super dans votre substituée à l'initialiser, mais c'est une règle qui devrait être suivie par tous les développeurs ruby et rails de développeurs silencieusement attend que vous pour le faire.
OriginalL'auteur brad
Je suppose que vous voulez définir des valeurs par défaut pour votre modèle attribut ?
Il y a une autre solution que d'impérieuses ; vous pouvez définir des rappels :
OriginalL'auteur Marcel Falliere
pourquoi ne pas simplement créer une méthode dans votre modèle comme celui-ci
contenant cette logique (essentiellement votre boucle?)
donc, je ferais ce que j'ai dit dans ma réponse. un create_dates méthode de classe avec votre boucle de l'appel de nouveau à l'intérieur.
Désolé, j'ai besoin de mot ma question mieux. Mais, fondamentalement, je veux juste savoir comment remplacer Monmodèle.nouvelles(les attributs)
Je ne ferais pas ça si j'étais vous, mais peut-être que je me trompe. Intéressé par la réponse de toute façon!
+1, Vous ne devriez pas avoir à remplacer
new
, indépendamment de la façon dont vous êtes désireux de votre modèle de comportement. Si c'est absolument nécessaire pour ce faire, dans le modèle, je voudrais utiliser une combinaison de la suggestion ci-dessus avec unbefore_create
de rappel. Le rappel ont besoin d'un failsafes toutefois, afin de prévenir la spanwed instances de frai de leur propre.OriginalL'auteur Pasta
Vous pouvez utiliser:
Bien que j'ai lu quelque part qu'il n'était pas recommandable...
OriginalL'auteur jordinl
Cela pue de la méthode de factorisation avec patrons...de le rechercher.
Si vous êtes réticents pour une raison quelconque pour aller avec create_date par @Pâtes, puis éventuellement de créer un simple ruby objet (pas ActiveRecord soutenu), nommé YourModelFactory/Template/que ce soit avec deux instance de vars, vous pouvez utiliser votre standard params[:foo] pour attribuer ces - définir et appeler une méthode de classe qui renvoie vos objets réels.
Votre contrôleur logique ressemble maintenant à ceci:
Bonne chance.
Je trouve les usines sur les modèles sont mieux fait que les méthodes de la classe que de séparer les classes. Donc, def.make_me_things sur MakeMeThings.de nouvelles.
Je suis tout à fait +1 sur def.make_me_things - juste essayer de lui faire sentir pour modelish pour l'affiche originale.
OriginalL'auteur Cory
Strictement, bien que tardive, la bonne façon de remplacer nouveau dans un modèle est
OriginalL'auteur s1mpl3