Menu

Category

Archive

logo


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

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

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?