Paperclipを使用していて、開発環境では画像の保存先を :rails_root/public/
のようにして、テスト環境やプロダクション環境では S3 等の個別の設定をしたいといった場合がある思います。今回はその方法に関して。
新規モジュールの作成
まずは、個別に設定するために、app/models/shared/attachment_helper.rb
に以下のようなファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | module Shared module AttachmentHelper def self.included(base) base.extend ClassMethods end module ClassMethods def has_attachment(name, options = {}) if Rails.env.production? then # Not yet, it should be like test env options[:storage] ||= :s3 options[:s3_credentials] ||= File.join(Rails.root, 'config', 's3_production.yml') elsif Rails.env.test? then puts "Test enviroment s3 setting is processed." options[:storage] ||= :s3 options[:s3_credentials] ||= File.join(Rails.root, 'config', 's3_test.yml') options[:path] ||= "/images/:class/:lesson_identifer/:attachment/:style.:extension" options[:url] ||= 's3-us-west-2' else puts "Development enviroment setting is processed." # For local Dev envs, use the default filesystem, but separate the environments # into different folders, so you can delete test files without breaking dev files. options[:path] ||= ":rails_root/public/images/:class/:lesson_identifer/:attachment/:style.:extension" options[:url] ||= "/images/:class/:lesson_identifer/:attachment/:style.:extension" end # To use string id for the path/url Paperclip.interpolates :lesson_identifer do |attachment, style| "#{attachment.instance.lesson_identifer}" end # pass things off to paperclip. has_attached_file name, options end end end end |
Rails.env
の値によって Paperclip の設定を変更しています。そして、モデルの中では、モジュールをインクルードし、上記の has_attachment
を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Lesson < ActiveRecord::Base include Shared::AttachmentHelper # For catcher image has_attachment :catcher, :styles => { :big => "2000x798", :medium => "1000x399" } validates_attachment_content_type :catcher, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"] # To use string id def to_param lesson_identifer end end |
これで完了。
参考
How can I set paperclip’s storage mechanism based on the current Rails environment?