2011-06-18 3 views
1

マイセットアップのためCurrentBucketNotSpecifiedエラーがスローされます。ペーパークリップ2.3.11は `expiring_url`

1)私は、S3を指すように自分のドメインにCNAMEを追加しました。私は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" 

は私が期待されるURLを取得:

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

2)私はS3

3)モデルのコードにassets.foo.comと呼ばれるバケツを持っています。

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

試みが:s3_host_aliasキーが指定されていると:urlキーが":s3_alias_url"に設定されている場合、バケット名が推測されたユーザマニュアルによると、期限切れ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 

を生成するとき、私はエラーを取得します。私は指示に従って自分のモデルを構成しました。私はまだエラーに遭遇しました。

私は、すなわち

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関数は、bucket構成が存在していても期待されるURLを生成します。

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 
+0

でパッチを使用すると、DNSが完全にpropigatedされていることを確認しましたが追加されましたか? –

+0

はい。例:http://assets.foo.com/study/report/..../ abc.pdfのURLが正しく解決されています。 –

答えて

0

この現象は、s3_host_aliasが設定されているときにexpire_url関数が呼び出された場合にのみ発生します。私は猿がこの問題を回避するために宝石を貼った。

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

問題は、あなたはそれがあなたの現在のバケットを推測することはできません状況にあるということです。 documentationには、このエラーを回避するためにバケット名を設定できることが記載されています。しかし、あなたはこれが正しいURLを生成しないことに気づいた。

設定の:urlを正しい値に設定し、バケットの正しい設定で正しく動作するようにしてください。正しく動作するはずです。

+0

これはPaperclip gemのバグです。私はパッチで回答を掲示しました。 –