Comment puis-je mettre un trombone, du mécanisme de stockage basée sur les Rails de l'environnement?
J'ai une application rails qui a plusieurs modèles avec un trombone, des pièces jointes qui sont tous téléchargée sur S3. Cette application dispose également d'une grande suite de test qui est exécuté assez souvent. L'inconvénient de ceci est que une tonne de fichiers sont téléchargés dans notre S3 compte sur chaque série de tests, faisant de la suite de tests de courir lentement. Il ralentit aussi le développement un peu, et vous oblige à avoir une connexion internet pour travailler sur le code.
Est-il un moyen raisonnable de définir la forme de trombone mécanisme de stockage basé sur les Rails de l'environnement? Idéalement, notre test et les environnements de développement serait d'utiliser le système de fichiers local de stockage, et de l'environnement de production serait de l'utiliser de stockage S3.
Je tiens également à extraire de cette logique dans un module partagé d'une certaine sorte, puisque nous avons plusieurs modèles qui auront besoin de ce comportement. Je voudrais éviter une solution à ceci à l'intérieur de chaque modèle:
### 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
Mise à jour: Le collant, c'est que la pièce jointe est :path
et :url
options diffèrent selon le système de stockage est utilisé.
Des conseils ou des suggestions seraient grandement appréciés! 🙂
Vous devez vous connecter pour publier un commentaire.
J'aime Barry suggestion du mieux et il n'y a rien qui vous retient de définition de la variable à une valeur de hachage, qui peut ensuite être fusionné avec le trombone options.
Dans config/environments/développement.rb et de test.rb mis quelque chose comme
Et dans config/environments/production.rb
Enfin dans votre trombone modèle:
Mise à jour: Une approche similaire a été récemment mis en œuvre en forme de Trombone pour Rails 3.x des applications. Environnement spécifique, les paramètres peuvent être définis avec
config.paperclip_defaults = {:storage => :s3, ...}
.Vous pouvez définir les paramètres par défaut des données de configuration dans l'environnement des fichiers de configuration spécifiques. Par exemple, dans le fichier config/environments/production.rb:
Après avoir joué avec lui pendant un moment, je suis venu avec un module qui fait ce que je veux.
À l'intérieur de
app/models/shared/attachment_helper.rb
:(Note: je suis à l'aide de coutume, un trombone, des interpolations ci-dessus, comme
:uuid_partition
,:uuid
et:s3_authenticated_url
. Vous aurez besoin de modifier les choses comme il faut pour votre application particulière)Maintenant, pour chaque modèle de trombone, les pièces jointes, il vous suffit d'inclure ce module partagé, et d'appeler la
has_attachment
méthode (au lieu de trombone duhas_attached_file
)Un exemple de fichier de modèle:
app/models/user.rb
:Dans ce lieu, vous aurez les fichiers enregistrés dans les emplacements suivants, en fonction de votre environnement:
Développement:
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
De Production:
https://s3.amazonaws.com/your-bucket-name/user_avatars/aa/bb/cc/aabbccddeeff/thumbnail.jpg
C'est exactement ce que je suis à la recherche pour, espérons-le, il va s'avérer utile à quelqu'un d'autre aussi. 🙂
-Jean
Comment à ce sujet:
Application.rb
Développement.rb (décommentez la ligne suivante pour essayer avec le s3, le mode de développement)
De Production.rb:
Dans votre modèle:
Ne pourriez-vous définir une variable d'environnement dans la production/test/développement.rb?
Alors:
Ma solution est de même avec @runesoerensen réponse:
J'ai créer un module
PaperclipStorageOption
dansconfig/initializers/paperclip_storage_option.rb
Le code est très simple:
et l'utiliser dans notre modèle
has_attached_file :avatar, { :styles => { :medium => "1200x800>" } }.merge(PaperclipStorageOption.options)
Juste, espérons que cette aide
Utiliser le :rails_env interpolation lorsque vous définissez la pièce jointe chemin: