0

Ich habe das Carrierwave-Juwel für Image-Uploads installiert. Ich muss mount_uploader :value, CheckItemValueImageUploader auf values mit der value_type gleich 3 anwenden. Hier ist, was ich versucht habe.Schienen - Wie kann ich eine if-Anweisung im Modell haben?

Der folgende Code wirft keine Fehler, es scheint auch keinen Unterschied zu machen, als ob die if-Anweisung es nicht gibt.

mount_uploader :value, CheckItemValueImageUploader, if: 'value_type == 3' 

habe ich versucht, den Code unter dem für die Nichtbildtypen (alles mit einem value_type anderen als 3) arbeitet, sondern speichert die Bilder als #<ActionDispatch::Http::UploadedFile:0x007fe74b2e2e28> statt image-name.png

if :value_type == 3 
mount_uploader :value, CheckItemValueImageUploader 
else 
end 

Und ich habe auch versucht, diese, die auch wird wie der erste Versuch ignoriert, so als ob die if-Bedingung nicht einmal angewendet wird

von selbst ohne, wenn stat ement mount_uploader :value, CheckItemValueImageUploader speichert Bilder in Ordnung aber jeder andere Werttyp speichert nicht (z. B. Text), die if-Anweisung sollte dies beheben. Ich weiß nicht, warum die zweite Option nicht funktioniert, aber ich bin sicher, es ist ein zufälliger Grund, der außerhalb meines Wissensbereichs auf Schienen liegt. Ich hoffe wirklich, dass hier jemand eine funktionierende Lösung hat.

Antwort

1

Normalerweise sollten Sie einen Block verwenden:

mount_uploader :value, CheckItemValueImageUploader, if: proc { |o| o.value_type == 3 } 

wo o eine Instanz eines Modells.

Aber die richtige Art und Weise ein signle Feld für verschiedene Zwecke zu verwenden ist STI zu verwenden, so dass Sie eine einzige übergeordnete Klasse für eine Tabelle haben wird, und Unterklassen für verschiedene Fälle:

app/models/base_model. rb:

class BaseModel < AR::Base 
end 

app/models/base_models/pic.rb:

class Pic < BaseModel 
    mount_uploader :value, CheckItemValueImageUploader # value as an image 
end 

app/models/base_models/text.rb:

class Text < BaseModel 
    # value as a string 
end 

Hinweis, dass Sie die type Feld an die base_models Tabelle hinzuzufügen haben.

+0

Ich habe versucht, Hinzufügen von ', wenn: proc {| o | o.value_type == 3} 'aber es hat nichts gemacht (wie der erste und dritte Versuch, den ich hatte). Ich brauche es, weil ich 'Items' habe, die Werte haben, diese Werte können variieren, je nachdem, welche Informationen sie haben, wie lange Textblöcke, ein oder zwei Wörter, Links usw. (' value_type' hält, welche Art von Wert es ist) Ich füge die Fähigkeit hinzu, dass Bilder für einen Gegenstand als Wert hochgeladen werden können. Wenn ich eine ganz neue Spalte nur dafür mache, würde dies eine Menge von Kerncodierungsänderungen verursachen, so dass ich sehe, ob es möglich ist, dies zu tun Pfad stattdessen – Rob

+0

Es ist zu spät, um STI an dieser Stelle leider zu implementieren, ich würde wieder mit viel Codierung beginnen müssen. Kennen Sie den Grund warum ?, wenn: proc {| o | o.value_type == 3} 'funktioniert nicht? oder meine anderen Methoden funktionieren nicht. Es wäre schön zu wissen, warum es nicht funktioniert, also weiß ich, ob es eine Sackgasse ist oder ob es Hoffnung gibt. – Rob

+0

Der Grund, warum die Option _if_ nicht funktioniert, wird in meiner Antwort erklärt. Es spielt keine Rolle, welchen Wert/proc Sie an _if_ übergeben, die Methode 'mount_uploader' verwendet sie nicht. Ich würde die Meinung von @ МалъСкрылевъ über die Verwendung von STI an zweiter Stelle setzen. –

0

ich keinen Hinweis auf eine wenn finden: Option auf der mount_uploader Methode Dokumentation:

http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Mount:mount_uploader

Auch ist es nicht erwähnt in der Quelle für die neueste stabile Version (0.11):

https://github.com/carrierwaveuploader/carrierwave/blob/17ae595237339ea9372aa4b9144387c5041b32f0/lib/carrierwave/mount.rb

Sind Sie sicher, dass Sie mischen es nicht mit dem Auto nach oben rierWave :: Uploader :: Versionen :: ClassMethods # version Methode, die das unterstützt?

http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Versions/ClassMethods#version-instance_method

+0

Ja, ich überprüfte, ob sie irgendetwas hatten, aber sie diddnt. Deshalb versuche ich es im Modell so zu machen, dass es nichts mit den Carrierwave-Modellen zu tun hat. – Rob

Verwandte Themen