这是我在 5 种不同模型(相同代码)中编写的代码。
has_attached_file :image,
s3_region: 'ap-northeast-1',
storage: :s3,
s3_protocol: :https,
s3_credentials: "#{Rails.root}/config/amazon_s3.yml",
url: ':s3_domain_url',
path: '/images/:id/:filename',
s3_host_alias: 'https://s3-ap-northeast-1.amazonaws.com/'
有什么方法可以将它晾干,以便我只将它放在一个地方并在不同的模型中使用它?
最佳答案
当然,您可以使用 concenrs .
# models/concenrs/attachable.rb
module Attachable
extend ActiveSupport::Concern
included do
has_attached_file :image,
s3_region: 'ap-northeast-1',
storage: :s3,
s3_protocol: :https,
s3_credentials: "#{Rails.root}/config/amazon_s3.yml",
url: ':s3_domain_url',
path: '/images/:id/:filename',
s3_host_alias: 'https://s3-ap-northeast-1.amazonaws.com/'
end
end
在模型中:
class User < ApplicationRecord
include Attachable
end
附言Ilya 的谨慎评论的意思是,虽然在模型中保留 S3 存储设置是一个可行的解决方案,但您最好将这些设置放入配置文件中。有关一些示例,请参阅 official Paperclip-with-Amazon-S3 guide (还有关于 Paperclip::Storage::S3
类的其他文章和文档的链接)。
一个选项是:
# config/secrets.yml
defaults: &defaults
amazon:
s3_bucket_name: 's3_bucket_name'
aws_access_key_id: 'access_key_id'
aws_secret_access_key: 'aws_secret_access_key'
aws_region: 'aws_region'
# config/environments/production.rb
config.paperclip_defaults = {
storage: :s3,
s3_credentials: {
bucket: Rails.application.secrets.amazon['s3_bucket_name'],
access_key_id: Rails.application.secrets.amazon['aws_access_key_id'],
secret_access_key: Rails.application.secrets.amazon['aws_secret_access_key'],
s3_region: Rails.application.secrets.amazon['aws_regio'],
}
}
关于ruby-on-rails - 如何 DRY 我在 5 个模型中编写的 has_attached_file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40789258/