Menu

Category

Archive

logo


Paperclipを環境ごとに設定を変更する

2014-09-03 10:00:00 +0900
  • このエントリーをはてなブックマークに追加

Paperclipを使用していて、開発環境では画像の保存先を :rails_root/public/ のようにして、テスト環境やプロダクション環境では S3 等の個別の設定をしたいといった場合がある思います。今回はその方法に関して。

新規モジュールの作成

まずは、個別に設定するために、app/models/shared/attachment_helper.rb に以下のようなファイルを作成します。

 1 module Shared
 2   module AttachmentHelper
 3 
 4     def self.included(base)
 5       base.extend ClassMethods
 6     end
 7 
 8     module ClassMethods
 9       def has_attachment(name, options = {})
10 
11         if Rails.env.production? then
12           # Not yet, it should be like test env
13           options[:storage]         ||= :s3
14           options[:s3_credentials]  ||= File.join(Rails.root, 'config', 's3_production.yml')
15         elsif Rails.env.test? then
16           puts "Test enviroment s3 setting is processed."
17           options[:storage]         ||= :s3
18           options[:s3_credentials]  ||= File.join(Rails.root, 'config', 's3_test.yml')
19           options[:path] ||= "/images/:class/:lesson_identifer/:attachment/:style.:extension"
20           options[:url]             ||= 's3-us-west-2'
21         else
22           puts "Development enviroment setting is processed."
23           # For local Dev envs, use the default filesystem, but separate the environments
24           # into different folders, so you can delete test files without breaking dev files.
25           options[:path] ||= ":rails_root/public/images/:class/:lesson_identifer/:attachment/:style.:extension"
26           options[:url]  ||= "/images/:class/:lesson_identifer/:attachment/:style.:extension"
27         end
28 
29         # To use string id for the path/url
30         Paperclip.interpolates :lesson_identifer do |attachment, style|
31           "#{attachment.instance.lesson_identifer}"
32         end
33 
34         # pass things off to paperclip.
35         has_attached_file name, options
36       end
37     end
38   end
39 end

Rails.env の値によって Paperclip の設定を変更しています。そして、モデルの中では、モジュールをインクルードし、上記の has_attachment を使用します。

 1 class Lesson < ActiveRecord::Base 
 2   include Shared::AttachmentHelper
 3   # For catcher image
 4   has_attachment :catcher,
 5                  :styles => {
 6                     :big  => "2000x798",
 7                     :medium => "1000x399"
 8                   }
 9  validates_attachment_content_type :catcher, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]
10 
11   # To use string id
12   def to_param
13     lesson_identifer
14   end
15 end

これで完了。

参考

How can I set paperclip's storage mechanism based on the current Rails environment?