ruby-on-rails - 如何 DRY 我在 5 个模型中编写的 has_attached_file

标签 ruby-on-rails ruby ruby-on-rails-4 optimization

这是我在 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/

相关文章:

javascript - Chartkick + Rails 4 "undefined method ` pie_chart' for #<#<Class :. .."

ruby - Rails 4 : Custom routes, 单个模型的多个编辑表单

javascript - 谷歌地图身份验证不起作用,内容安全策略指令

ruby-on-rails - 我们可以编写没有哈希类的哈希吗?

Ruby:有没有办法只用前 x 次出现来拆分字符串?

javascript - 使用选择下拉列表使用 ruby​​ on Rails 参数更新 link_to

ruby-on-rails - 在方法参数中传递大对象是否可以?

ruby-on-rails-4 - Cloudinary 图像对于 Rails4 和 CarrierWave 来说并不刷新

javascript - 在Rails 3中从observe_field更改为JQuery

mysql - 使用 Ruby/Rails 基于信息架构生成 MySQL View