Скрепка разных стилей с разными разрешениями - PullRequest
3 голосов
/ 16 марта 2012

У меня есть модель GalleryPhoto с прикрепленным скрепкой, которая обрабатывается в нескольких стилях.Некоторые стили должны быть общедоступными;некоторые должны быть приватными.

Вот моя модель:

class GalleryPhoto < ActiveRecord::Base
  has_attached_file :image,
    :storage => :s3,
    :bucket => ":bucket.myapp_#{Rails.env == 'production' ? 'production' : 'development'}",
    :path => "images/galleries/:gallery_id/:id/:style_:id.:extension",
    :url => "/images/galleries/:gallery_id/:id/:style_:id.:extension",
    :s3_credentials => { :access_key_id => 'XXXXXXXXX', :secret_access_key => 'XXXXXXXXX' },
    :s3_permissions => {
      :thumbnail => :public_read,
      :small => :public_read,
      :medium => :public_read,
      :large => :public_read,
      :small_download => :private,
      :original => :private
    },
    :styles => {
      :thumbnail => {
        :geometry => "80x80>"
      },
      :small => {
        :geometry => "200x200>"
      },
      :medium => {
        :geometry => "400x400>"
      },
      :large => {
        :geometry => "600x600>"
      },
      :small_download => {
        :geometry => "600x600"
      }
    }
end

Вот мой инициализатор скрепки:

Paperclip.interpolates :bucket do |attachment, style|
  [:original, :small_download].include?(style) ? "private" : "public"
end

Paperclip.interpolates :gallery_id do |attachment, style|
  attachment.instance.gallery_id
end

У меня четыре ведра как таковые:

private.myapp_development
private.myapp_production
public.myapp_development
public.myapp_production

Сегменты private.xxx не должны быть общедоступными, но сегменты public.xxx должны быть общедоступными.

Я могу заставить приложение обслуживать стили, помеченные как общедоступные вобщедоступные сегменты, но я не могу выполнить загрузку или выполнить действие загрузки, которое служит частным стилям.

Вот журнал, когда я пытаюсь выполнить загрузку:

[paperclip] Saving attachments.
[paperclip] saving images/galleries/242/22034/original_22034.jpg
   (0.8ms)  ROLLBACK
Completed 500 Internal Server Error in 8013ms

Errno::EPIPE (Broken pipe):
  app/controllers/gallery_photos_controller.rb:13:in `create'

Вотвойти, когда я пытаюсь использовать действие загрузки для личных стилей:

Sent file images/galleries/222/19515/original_19515.jpg (0.2ms)
Completed 500 Internal Server Error in 861ms

ActionController::MissingFile (Cannot read file images/galleries/222/19515/original_19515.jpg):
  app/controllers/gallery_photos_controller.rb:22:in `download'

Чего мне не хватает?

rails 3.1.1
paperclip 2.7.0
aws-sdk 1.3.7

1 Ответ

0 голосов
/ 23 марта 2012

Скрепку просто не хотелось хранить в двух ведрах с одинаковыми насадками.Поэтому я разделил стили на общие / частные «папки» в одной корзине с разными разрешениями для каждого стиля.

Вот мой код модели:

  has_attached_file :image,
    :storage => :s3,
    :bucket => "myapp-#{Rails.env == 'production' ? 'production' : 'development'}",
    :path => ":bucket/images/galleries/:gallery_id/:id/:style_:id.:extension",
    :url => "/:bucket/images/galleries/:gallery_id/:id/:style_:id.:extension",
    :s3_credentials => { :access_key_id => 'XXXXX', :secret_access_key => 'XXXXXXXXX' },
    :s3_permissions => {
      :thumbnail => :public_read,
      :small => :public_read,
      :medium => :public_read,
      :large => :public_read,
      :small_download => :private,
      :original => :private
    },
    :styles => {
      :thumbnail => {
        :geometry => "80x80>"
      },
      :small => {
        :geometry => "200x200>"
      },
      :medium => {
        :geometry => "400x400>"
      },
      :large => {
        :geometry => "600x600>"
      },
      :small_download => {
        :geometry => "600x600"
      }
    }

Когда я проверяю разрешениядля файлов в консоли s3 они подходят.

...