Rails - Ajouter des attributs pas dans le modèle et le modèle de mise à jour de l'attribut
J'ai 3 champs dans mon formulaire sorcière ne sont pas dans ma base de données: opening_type, opening_hours, opening_minutes. Je veux mettre à jour l'attribut principal de "l'ouverture" (base de données) avec ces 3 champs.
J'ai essayé beaucoup de choses qui ne fonctionnent pas.
En fait, j'ai:
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
J'ai essayé d'ajouter quelque chose comme:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
Mais, les accesseurs méthodes ne sont pas appelé et je pense que opening_type, opening_hours, opening_minutes ont été vide trop si les accesseurs ont été appelés...
Je pense que je n'ai pas besoin d'un before_save de rappel et devrait faire de cette réécriture de l'accesseurs.
Notes:
- Rails 3.0.5,
- opening_type, :opening_hours, :opening_minutes pourrait être vide
EDIT: j'ai mis à jour mon code
OriginalL'auteur alex.bour | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
Noter que
attr_reader
,attr_writer
etattr_accessor
sont juste des macros pour définir vos propres méthodes.À l'heure actuelle, votre setter qui ne font rien de spécial, donc si vous venez de passer à
attr_accessor
votre code deviendra plus propre.Votre autre question, c'est que votre
opening=
méthode est de ne jamais être appelé, et cela a un sens, car il n'y a nulle part dans votre code en l'appelant. Ce que vous voulez vraiment est pour votre ouverture d'être ensemble après que toutes les pièces ont été établis. Maintenant, il n'y a pas moyen trivial de le faire, mais les Rails n'ontbefore_validation
de rappel où vous pouvez mettre le code qui s'exécute après que les valeurs ont été fixées, mais avant la validation:opening
champ dans la base de données. Une autre approche serait de stocker les composants individuels dans la base de données et de construire le combiné chaîne dynamiquement à la demande. Selon vos besoins, cela peut même être une meilleure approche pour vous.Je reçois cette base de données avec l'ouverture du champ. Cette base de données de synchronisation avec une application pour smartphone et je ne peux pas modifier sa structure pour stocker les 3 champs différents. 😉 Le problème avec un before_validation de rappel, c'est que vous ne le manipulez pas le cas quand nous allons modifier la forme... et où j'ai besoin de tronquer l'ouverture du champ dans 3 vars... pour la forme. Je sais que je peux le faire manuellement, mais je pensais qu'il y avait mieux à faire qu'avec les accesseurs...
Tout à fait vrai, mais votre suggestion de l'annulation de la
opening=
va casser beaucoup de choses. Aussi, c'est un très sommaires idée d'avoir une méthode de définition qui a totalement ignore le paramètre qui est passé en. Mieux vaut avoir une méthode distincte (comme monset_opening
) qui montre clairement ce qu'il fait. Vous n'avez pas pour utiliser before_validation pour appeler cette méthode, mais je recommande vivement que c'est une méthode séparéeEn fait, je peux lire les 3 champs avec mon code et remplissez le formulaire. OK, je vais utiliser votre astuce avec le before_validation(). Merci.
OriginalL'auteur Gareth
au lieu de
vous avez besoin
hf...
//Sont :opening_type, :opening_hours, :opening_minutes de véritables champs? Si oui, alors vous avez juste besoin de cela?
attr_accessor :ouverture
attr_reader :ouverture
voir mise à jour,....
Pas de. Le champ réel est "l'ouverture" dans ma base de données. J'ai besoin de concat 3 champs envoyé à partir de mon formulaire: opening_type, opening_hours, opening_minuts pour combler les principales "ouverture" sur le terrain. Ces 3 champs ne sont pas dans la base de données. J'ai mis à jour le premier post.
Puis accesseurs sont les worng. Vous pourriez les utiliser pour séparer une chaîne dans beaucoup d'autres, mais pas l'inverse. Vous devez les stocker ces données dans la base de données et puis vous pourriez écrire un
opening
méthode au afficher le concated champs!Non je peux pas. Je reçois ces base de données avec l'ouverture du champ. Cette base de données de synchronisation avec une application pour smartphone et je ne peux pas modifier sa structure pour stocker les 3 champs. 😉
OriginalL'auteur davidb