在我使用Paperclip之前,我是在新项目中第一次使用Active Storage。在回形针中,我们可以选择添加默认样式和内容类型验证。像:
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\z/
我似乎找不到任何有关如何在ActiveStorage中实现这些功能的文档。
答案 0 :(得分:1)
ActiveStorage中尚无验证,因此您可以像这样使用custom validator:
class MyModel < ApplicationRecord
has_one_attached :some_img
validates :some_img, image: true
end
class ImageValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors[attribute] << I18n.t('errors.file_size') unless file_size_valid?(value)
record.errors[attribute] << I18n.t('errors.file_type') unless file_type_valid?(value)
end
private
def file_size_valid?(value)
value.blob.byte_size <= 5.megabytes
end
def file_type_valid?(value)
!value.blob.content_type.starts_with?('image/')
end
end
没有样式的回形针语法,但您可以为此使用variant:
my_object.some_img.variant(resize: '100x100>')
它将options直接传递给ImageMagick。
也没有默认图像选项,因此在模型中或作为装饰器创建某种方法可能会有所帮助。
答案 1 :(得分:0)
此链接https://devcenter.heroku.com/articles/paperclip-s3
将此添加到gemfile
gem 'paperclip'
gem 'aws-sdk', '~> 2.3'
然后安装捆绑包
config.paperclip_defaults = {
storage: :s3,
s3_credentials: {
bucket: ENV.fetch('S3_BUCKET_NAME'),
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: ENV.fetch('AWS_REGION'),
}
}
此外,我们需要在Heroku应用程序上设置AWS配置变量。
heroku config:set S3_BUCKET_NAME=your_bucket_name
heroku config:set AWS_ACCESS_KEY_ID=your_access_key_id
heroku config:set AWS_SECRET_ACCESS_KEY=your_secret_access_key
heroku config:set AWS_REGION=your_aws_region
$ rails g migration AddAvatarToProfiles
class AddAvatarToProfiless < ActiveRecord::Migration
def self.up
add_attachment :profiles, :avatar
end
def self.down
remove_attachment :profiles, :avatar
end
end
然后rake db:migrate
这是在视图中
<%= form_for(@profile, multipart: true) do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :avatar %>
<%= f.file_field :avatar %>
</div>
<div class="actions">
<%= f.submit 'Make a friend' %>
<%= link_to 'Nevermind', friends_path, class: 'button' %>
</div>
<% end %>
这是在控制器内部
类ProfilesController def create
@profile = Profile.new(profile_params)
if @profile.save
redirect_to @friend, notice: 'Profile was successfully created.'
else
render action: 'new'
end
end
private
def profile_params
params.require(:profile).permit(:avatar, :name)
end
end