2

次のファイルにデータが保存されています。これは何のデータだと思いますか? :)

S3_CREDENTIALS = Rails.root.join("config/s3.yml")

動作していることを確認するために、Rails コンソールを起動したところ、S3_CREDENTIALS が Pathname オブジェクトであることがわかりました。しかし、データがそこにあることを確認するのに苦労しています。たとえば、バケットデータにアクセスするにはどうすればよいですか?

Loading development environment (Rails 3.1.0.beta1)
>> S3_CREDENTIALS.isdir
NoMethodError: undefined method `isdir' for #<Pathname:0x10212f6f8>
    from (irb):1
>> S3_CREDENTIALS.size
=> 282
>> S3_CREDENTIALS.data
NoMethodError: undefined method `data' for #<Pathname:0x10212f6f8>
    from (irb):3
>> S3_CREDENTIALS[:bucket]
NoMethodError: undefined method `[]' for #<Pathname:0x10212f6f8>
    from (irb):4
>> 

関連して、ファイルを s3.yml から s3.json に変更しても、これは機能しますか?

4

1 に答える 1

4

これを Paperclip で s3 ストレージとして使用している場合は、yml のままにしておく必要があります。イニシャライザ (config/initializers) 内に次のファイルを作成します。

app_config.rb

AppConfig = YAML.load(File.read(Rails.root + 'config' + 'config.yml'))[Rails.env].with_indifferent_access

すべての s3 の設定は次の形式である必要があります。

config.yml

development:
  s3:
    access_id: access-id
    secret_key: secret
    bucket_name: your-bucket-name-for-development
staging:
  s3:
    access_id: access-id
    secret_key: secret
    bucket_name: your-bucket-name-for-staging
production:
  s3:
    access_id: access-id
    secret_key: secret
    bucket_name: your-bucket-name-for-production

この時点で、コンソールに移動して、次のように入力するだけで s3 データにアクセスできるはずです。

AppConfig[:s3]

そして、次のようなすべてのデータでハッシュを取得する必要があります。

{"access_id"=>"access-id", "bucket_name"=>"your-bucket-name-for-development", "secret_key"=>"secret"}

上記は、開発時に s3 をテストする場合の例ですが、通常は開発時にローカル ファイル ディレクトリに保存し、リモート ステージングおよび本番環境に s3 を使用します。

バケット データへのアクセスは別の会話であり、バケット データをモデルにどのように関連付けるかによって異なります。たとえば、バケット データが次のように Photo モデルに関連付けられている場合:

写真.rb

require 'paperclip'

class Photo < ActiveRecord::Base
  belongs_to :album
  before_save :set_orientation

  if AppConfig['s3']
    has_attached_file :data, 
      :styles => { 
        :thumb => "200x200>",
        :medium => "700x700>" 
      },
      :storage => :s3, 
      :default_style => :medium,
      :bucket => AppConfig['s3']['bucket_name'],
      :s3_credentials => { :access_key_id => AppConfig['s3']['access_id'], :secret_access_key => AppConfig['s3']['secret_key'] },
      :s3_headers => { 'Cache-Control' => 'max-age=315576000', 'Expires' => 10.years.from_now.httpdate },
      :path => "/:class/:id/:style/:filename"
  else
    has_attached_file :data,
      :styles => { 
        :thumb => "200x200>",
        :medium => "700x700>"
      },
      :storage => :filesystem, 
      :default_style => :medium
  end

  private
  def set_orientation
    self.orientation = Paperclip::Geometry.from_file(self.data.to_file).horizontal? ? 'horizontal' : 'vertical'
  end
end

has_attached_file :data に示すように、data という添付ファイル名があります。したがって、バケット データにアクセスするには、次のように呼び出します。

Photo.first.data(:thumb)

そして、返された最初の Photo オブジェクトに対してサムネイル写真が保存していた s3 URL を取得します。上記の例では、「paperclip」gem と「aws-s3」gem も使用しています。

config.gem 'aws-s3', :version => '>=0.6.2', :lib => 'aws/s3'
config.gem 'paperclip'

これが途中で役立つことを願っています。

于 2011-06-27T07:20:53.363 に答える