Wie kann ich den Speichermechanismus von Paperclip basierend auf der aktuellen Rails-Umgebung einstellen?
Ich habe eine rails-Anwendung, die mehrere Modelle mit Büroklammer für Anhänge, die alle auf S3 hochgeladen. Diese app hat auch eine große test-suite, die laufen ziemlich oft. Der Nachteil hierbei ist, dass eine Tonne von Dateien hochgeladen werden, um unseren S3-Konto auf jedem test ausgeführt werden, so dass die test-suite laufen langsam. Es verlangsamt sich auch die Entwicklung ein bisschen, und erfordert, dass Sie eine Internetverbindung haben, um am code zu arbeiten.
Gibt es eine vernünftige Möglichkeit, um die Büroklammer-Aufbewahrung-Mechanismus basiert auf der Rails-Umgebung? Im Idealfall, unseren test-und Entwicklungsumgebungen verwenden würden, das lokale Dateisystem, Speicher -, und Produktions-Umgebung verwenden würden, S3-Speicher.
Ich würde auch gerne zu extrahieren, diese Logik in ein gemeinsames Modul von einer Art, da haben wir einige Modelle, die dieses Verhalten. Ich möchte vermeiden, eine Lösung wie diese im inneren jedes Modells:
### We don't want to do this in our models...
if Rails.env.production?
has_attached_file :image, :styles => {...},
:path => "images/:uuid_partition/:uuid/:style.:extension",
:storage => :s3,
:url => ':s3_authenticated_url', # generates an expiring url
:s3_credentials => File.join(Rails.root, 'config', 's3.yml'),
:s3_permissions => 'private',
:s3_protocol => 'https'
else
has_attached_file :image, :styles => {...},
:storage => :filesystem
# Default :path and :url should be used for dev/test envs.
end
Update: Der klebrige Teil ist, dass die Anlage :path
und :url
Optionen müssen, unterscheiden sich je nachdem, auf welche storage-system verwendet wird.
Jede Beratung oder Anregungen würde sehr geschätzt werden! 🙂
InformationsquelleAutor der Frage John Reilly | 2010-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mag ich Barry ' s Vorschlag besser, und es gibt nichts halten Sie von der Einstellung der Variablen auf einen hash, die dann zusammengeführt werden mit dem Büroklammer-Optionen.
In config/environments/development.rb und testen.rb etwas wie
Und in config/environments/production.rb
Schließlich in Ihre Büroklammer-Modell:
Update: Ein ähnlicher Ansatz wurde kürzlich umgesetzt Büroklammer für Rails 3.x-apps. Umfeld bestimmte Einstellungen kann nun eingestellt werden, mit
config.paperclip_defaults = {:storage => :s3, ...}
.InformationsquelleAutor der Antwort runesoerensen
Können Sie festlegen globaler default-Konfigurationsdaten in der Umwelt-spezifischen Konfigurations-Dateien. Zum Beispiel, in config/environments/production.rb:
InformationsquelleAutor der Antwort austinfromboston
Nach Herumspielen mit ihm für eine Weile, kam ich mit einem Modul, das macht was ich will.
Innen
app/models/shared/attachment_helper.rb
:(Hinweis: ich bin mit einige benutzerdefinierte Büroklammer Interpolationen vor, wie
:uuid_partition
:uuid
und:s3_authenticated_url
. Sie müssen, Dinge zu ändern, nach Bedarf für eine bestimmte Anwendung)Nun, für jedes Modell, das mit Büroklammer Anhänge, die Sie gerade haben, um diese gemeinsame Modul, und nennen Sie die
has_attachment
- Methode (anstelle der Büroklammer isthas_attached_file
)Ein Beispiel-Modell-Datei:
app/models/user.rb
:In diesem Ort, müssen Sie gespeicherte Dateien in die folgenden Ordner, je nach Umgebung:
Entwicklung:
RAILS_ROOT + public/attachments/development/user_avatars/aa/bb/cc/aabbccddeeff/thumbnail.jpg
Test:
RAILS_ROOT + public/attachments/test/user_avatars/aa/bb/cc/aabbccddeeff/thumbnail.jpg
Produktion:
https://s3.amazonaws.com/your-bucket-name/user_avatars/aa/bb/cc/aabbccddeeff/thumbnail.jpg
Diese macht genau das, was ich Suche, hoffentlich werde als nützlich erweisen, um jemand anderem zu. 🙂
-John
InformationsquelleAutor der Antwort John Reilly
Wie wäre es damit:
Anwendung.rb
Entwicklung.rb (kommentieren Sie dies, um zu versuchen, mit s3 in der Entwicklung Modus)
Produktion.rb:
In Ihrem Modell:
InformationsquelleAutor der Antwort John Naegle
Könntest du nicht einfach eine Umgebungsvariable festlegen, in der Produktion/test/Entwicklung.rb?
Dann:
InformationsquelleAutor der Antwort Barry Hess
Meine Lösung ist die gleiche mit @runesoerensen Antwort:
Ich ein Modul erstellen
PaperclipStorageOption
imconfig/initializers/paperclip_storage_option.rb
Der code ist sehr einfach:
und verwenden Sie es in unser Modell
has_attached_file :avatar, { :styles => { :medium => "1200x800>" } }.merge(PaperclipStorageOption.options)
Nur, hoffe, dass dies helfen
InformationsquelleAutor der Antwort duykhoa
Verwenden :rails_env interpolation bei der Definition der Anlage Pfad:
InformationsquelleAutor der Antwort Marko Tunjic