Ruby (Rails) Délégué attributs à un autre modèle de la méthode?
-EDIT-
Après avoir lu au sujet de la méthode du Délégué de la première réponse, ma question est, est-il possible de déléguer deux méthodes différentes pour une autre méthode unique.
IE: j'ai actuellement: @photo.pièce jointe.fichier.url, et @photo.pièce jointe.de la hauteur, et @photo.pièce jointe.largeur
J'aimerais être en mesure d'accéder à toutes ces via @photo.fichier.url, @photo.fichier.hauteur, @photo.fichier.la largeur.
La raison pour laquelle la syntaxe est l'Attachement est un modèle qui utilise un Trombone pour gérer les fichiers, Trombone est la génération de l' .méthode de fichiers (le modèle est appelé pièce Jointe, le modèle utilise un Trombone, du has_attached_file :file
).
-QUESTION D'ORIGINE-
Je me demandais à propos de l'aliasing des méthodes et des attributs en Ruby (je pense que c'est un général ruby question, bien que ma demande est en Rails 3):
J'ai deux modèles: Photo has_one pièce Jointe.
Attachement a la "hauteur" et "largeur" des attributs, et un "fichier" (ou la méthode de Trombone).
Donc par défaut je peux accéder à des bits du modèle de Fixation de la sorte:
photo.attachment.width # returns width in px
photo.attachment.height # returns height in px
photo.attachment.file # returns file path
photo.attachment.file.url #returns url for the default style variant of the image
photo.attachment.file.url(:style) #returns the url for a given style variant of the image
Maintenant, dans ma photo de classe que j'ai créé cette méthode:
def file(*args)
attachment.file(*args)
end
Alors, maintenant, je peux tout simplement utiliser:
photo.file # returns file path
photo.file.url # returns file url (or variant url if you pass a style symbol)
Ma question est, j'ai été en mesure de diriger photo.attachment.file
juste photo.file
, mais je peux aussi la carte de la hauteur et la largeur de photo.file
, de sorte que, par souci de cohérence, j'ai pu accéder à la hauteur et la largeur des attributs par photo.file.height
et photo.file.width
?
Est une chose possible, et si oui, que faut-il ressembler?
Juste par souci de cohérence. Photo.la hauteur est bien, mais si tous les fichiers de commandes associées en vertu de la Photo.fichier c'est plus raccord avec le directeur de la moindre Surprise, du moins pour moi. Aussi, juste curieux de savoir si cela peut être fait.
Pourquoi ce n'est pas acceptée ? Rails délégué méthode est la réponse ici ? Quel était le problème avec ça ?
Peut-être que je ne suis pas à comprendre quelque chose, mais ce que je veux savoir c'est si je peux déléguer
@photo.attachment.height
, où height
est un attribut du modèle de fixation, à @photo.file.height
, où file
est une méthode fournie par un plugin. Je ne comprends pas comment faire, s'appuyant sur la réponse, et je n'ai pas pu le déduire pour moi-même. Donc, si vous pouvez répondre à cette question, vous bénéficiez de la prime 🙂Concernant votre modifier, ruby ne pas avoir une notion d'attributs par rapport aux méthodes. Ce sont tout simplement des méthodes.
OriginalL'auteur Andrew | 2011-01-16
Vous devez vous connecter pour publier un commentaire.
Donc ce que vous demandez, c'est que
Vous ne pouvez pas résoudre ce avec les délégués, parce que vous voulez que
file
pour signifier différentes choses en se basant sur ce qui suit. Pour parvenir à cette question, vous devez rouvrir trombone, je ne recommanderais pas (parce que je crois que l'api est bien la façon dont il est).La seule façon que je peux penser pour résoudre ce problème, consiste à ajouter éliminer les
file
niveau trop. Comme:De ce que vous pourriez résoudre à l'aide d'un
delegate
pour chacun des voulu méthodes.Vous écrivez donc
Espère que cette aide.
OriginalL'auteur nathanvda
Vous pouvez utiliser des Rails de "délégué" de la méthode. Jetez un oeil à ma réponse à cette question:
Ce qui est plus proche de Ruby façon de faire cette commande?
photo.file
plus précisément, plutôt que de seulementphoto
?OriginalL'auteur monocle
La manière la plus simple qui vient à l'esprit est de déléguer méthode d'url en pièce jointe de fichier:
De cette façon, vous pouvez appeler la photo.pièce jointe.url de la photo.pièce jointe.largeur, photo.pièce jointe.la hauteur, ce qui me semble assez cohérente. Vous pouvez éventuellement alias pièce jointe des fichiers de cette façon, vous obtiendrez la méthode exacte des noms que vous avez demandé (photo.fichier.largeur, photo.fichier.url), mais je ne recommanderais pas que, parce qu'il semble porter à confusion (de l'appel d'une pièce jointe "fichier").
OriginalL'auteur psyho
Avec plaine de Ruby, vous pouvez utiliser Forwardable:
OriginalL'auteur Damien Roche