我将数据存储在以下文件中:猜猜它是什么数据? :)
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,这仍然有效吗?
答案 0 :(得分:3)
如果您使用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模型相关联:
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
我的附件文件名称为data,如has_attached_file:data中所示。所以要访问一些桶数据,我会打电话:
Photo.first.data(:thumb)
这将拉出缩略图照片为返回的第一个Photo对象存储的s3网址。上面的例子也使用'paperclip'gem和'aws-s3'gem。
config.gem 'aws-s3', :version => '>=0.6.2', :lib => 'aws/s3'
config.gem 'paperclip'
希望这能帮到你。