2016-05-22 3 views
1

In meiner Rails-App verwende ich carrierwave für Bilder. Carrierwave schafft verschiedene Versionen eines Bildes und die URL kann wie folgt erreicht werden: picture.large.url, picture.small.url, picture.thumb.url usw.Wie das String-Argument einer Methode als Methodenname-Variable verwendet wird

Ich möchte ein Verfahren schaffen, die ein String-Argument akzeptieren können, die dann für die Bild-URL verwendet werden können, . Etwas wie folgt aus:

def profile_url (version) 
    picture.version.url 
end 

So dann kann ich schreiben @user.profile_url('thumb') und es sollte mir die URL in Daumengröße geben.

Ich bekomme eine undefinierte Methode 'Version' Fehler. Ist das möglich?

+2

Sie die Version als Argument übergeben können auf [ 'url'] (http://www.rubydoc.info/Gems/Carrierwave/CarrierWave% 2FUploader% 2FVersions% 3Aurl), dh 'picture.url ('Daumen')' – Stefan

+1

@Stefan Wenn Sie sicher sind, dann denke ich, dass Sie es als Antwort anbieten sollten. Obwohl die vorgeschlagene Antwort funktioniert, entfernt Ihr die Ausführlichkeit und Komplexität einer zusätzlichen Ebene über die Bibliothek und ist daher besser IMO. PS, an das OP, obwohl Sie eine Zeichenfolge angeben möchten, schlage ich vor, Sie überdenken und stattdessen ein Symbol verwenden. Es ist idiomatischer, einfacher zu tippen und einfacher (kein Fall oder Kodierung). –

+0

@KeithBennett danke für den Hinweis! – user4584963

Antwort

1

Gemäß der Dokumentation für CarrierWave des url, können Sie die Version als Argument übergeben:

Wenn Sie einen Versionsnamen als Parameter angegeben, wird die URL für diese Version zurückkehren [...]

my_uploader.url   #=> /path/to/my/uploader.gif 
my_uploader.url(:thumb) #=> /path/to/my/thumb_uploader.gif 

Ihr Code geschrieben, wie werden kann:

class User < ActiveRecord::Base 
    mount_uploader :picture, PictureUploader 

    def profile_url(version) 
    picture.url(version) 
    end 
end 

Und via genannt:

@user.profile_url('thumb') 
# or 
@user.profile_url(:thumb) 

Sie könnten auch die Methode aufrufen direkt:

@user.picture.url('thumb') 
# or 
@user.picture.url(:thumb) 
6

Normalerweise kann man es auf diese Weise tun:

def profile_url(version) 
    version = version.to_sym 

    case version 
    when :large, :small, :thumb 
    picture.send(version).url 
    end 
end 

Der Grund für die to_sym Anruf hier ist, so können Sie diese profile_url('thumb') oder profile_url(:thumb) anrufen und beide funktionieren.

+0

Willst du wirklich, dass dies bei einem schlechten Argument stumm scheitert? Ich denke, eine Ausnahme zu erheben wäre angemessen. Dies würde auch die Methode enorm vereinfachen: 'picture.send (version.to_sym) .url'. –

+0

@KeithBennett Hängt davon ab, wie wichtig das ist. Manchmal ist das leise Scheitern gut genug. Es kann robuster gemacht werden, indem eine Ausnahme ausgelöst wird. – tadman

+0

Richtig, aber der von mir bereitgestellte 1-Liner tut was Ihre Methode tut, löst aber eine Ausnahme aus, wenn ein nicht unterstützter Name verwendet wird (wenn es keine Methode mit diesem Namen gibt). –

Verwandte Themen