Скрепка 2.3.11 выдает ошибку CurrentBucketNotSpecified для `expiring_url` - PullRequest
1 голос
/ 19 июня 2011

Моя настройка:

1) Я добавил CNAME в свой домен, чтобы указать S3.

assets.foo.com  -> s3.amazonaws.com

2) У меня есть ведро с именем assets.foo.com на S3

3) Код модели:

has_attached_file :report,
  :storage        => :s3,
  :s3_credentials => { 
    :access_key_id      => "xxxx",
    :secret_access_key  => "yyyy"},
  :s3_permissions => 'private',
  :s3_protocol    => 'http',
  :s3_host_alias  => "assets.foo.com",
  :url            => ":s3_alias_url",
  :bucket         => "assets.foo.com",
  :path           => ":class/:attachment/:id_partition_:style.:extension"

Я получаю ожидаемый URL при вызове метода url.

s.report.url
#http://assets.foo.com/study/report/..../abc.pdf

Я получаю сообщение об ошибке при попытке создать истекающий URL

s.report.expiring_url
AWS::S3::CurrentBucketNotSpecified: No bucket name can be inferred from your current connection's address (`s3.amazonaws.com')
    from C:/Ruby187/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:107:in `current_bucket'
    from C:/Ruby187/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:179:in `bucket_name'
    from C:/Ruby187/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/object.rb:300:in `path!'
    from C:/Ruby187/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/object.rb:291:in `url_for'
    from C:/Ruby187/lib/ruby/gems/1.8/gems/paperclip-2.3.11/lib/paperclip/storage/s3.rb:98:in `expiring_url'
    from (irb):4

В соответствии с руководством пользователя имя сегмента выводится, если указана клавиша :s3_host_alias, а клавиша :url установлена ​​на ":s3_alias_url". Я настроил свою модель согласно инструкции. Я все еще столкнулся с ошибкой.

Мне удалось обойти проблему, добавив конфигурацию корзины, т.е.

has_attached_file :report,
  :storage        => :s3,
  :s3_credentials => { 
    :access_key_id      => "xxxx",
    :secret_access_key  => "yyyy"},
  :s3_permissions => 'private',
  :s3_protocol    => 'http', 
  :s3_host_alias  => "assets.foo.com",
  :url            => ":s3_alias_url",
  :bucket         => "assets.foo.com",
  :path           => ":class/:attachment/:id_partition_:style.:extension"

Когда я добавляю конфигурацию контейнера, метод expiring_url игнорирует пользовательский псевдоним CNAME.

s.report.expiring_url
#http://s3.amazon.com/assets.foo.com/study/report/..../abc.pdf

Интересно, что функция url генерирует ожидаемый URL, даже если присутствует конфигурация bucket.

s.report.url
#http://assets.foo.com/study/report/..../abc.pdf

Примечание : я пробовал различные комбинации псевдонимов CNAME с одинаковым результатом:

assets.foo.com  -> s3.amazonaws.com
assets.foo.com  -> assets.foo.com.s3.amazonaws.com

Ответы [ 2 ]

0 голосов
/ 19 июня 2011

Такое поведение наблюдается ТОЛЬКО при вызове функции expire_url при установке s3_host_alias.Я обезьяна пропатчил драгоценный камень, чтобы обойти проблему.

Добавлен патч в config\initializers\paperclip.rb

module Paperclip::Storage::S3
  def bucket_name_with_s3_host_alias
    s3_host_alias || bucket_name_without_s3_host_alias
  end
  alias_method_chain :bucket_name, :s3_host_alias

  def expiring_url_with_s3_host_alias
    result = expiring_url_without_s3_host_alias
    s3_host_alias.present? ? 
      result.gsub(/(\/s3.amazonaws.com)|(\.s3.amazonaws.com)/, '') : result
  end
  alias_method_chain :expiring_url, :s3_host_alias
end
0 голосов
/ 19 июня 2011

Проблема в том, что вы находитесь в ситуации, когда он не может вывести ваше текущее ведро. Документация говорит, что вы можете установить имя корзины, чтобы избежать этой ошибки. Однако, как вы поняли, это не будет генерировать правильный URL.

Попробуйте установить :url в вашей конфигурации на правильное значение, а также с правильной настройкой для корзины, и она должна работать.

...