ActiveStorage Rails(例如回形针)中的样式和验证

时间:2018-10-10 08:23:59

标签: ruby-on-rails ruby ruby-on-rails-5 paperclip rails-activestorage

在我使用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中实现这些功能的文档。

2 个答案:

答案 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 / environments / production.rb

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