Стилизация и проверки в ActiveStorage Rails, таких как Paperclip - PullRequest
0 голосов
/ 10 октября 2018

Я впервые использую Active Storage, в моем новом проекте, до этого я использовал Paperclip.В скрепке у нас была возможность добавить стандартные стили и проверки для типа контента.например:

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 голосов
/ 23 января 2019

В ActiveStorage еще нет проверки, поэтому вы можете использовать пользовательский валидатор , например:

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

Синтаксис для стилевого оформления не похож на скрепку, но вы можете использовать вариант для этой цели:

my_object.some_img.variant(resize: '100x100>')

Он передает опции непосредственно в ImageMagick.

Также нет опции изображения по умолчанию, поэтому может быть полезно создатькакой-то метод в модели или в качестве декоратора.

0 голосов
/ 11 октября 2018

Здесь по этой ссылке https://devcenter.heroku.com/articles/paperclip-s3

Добавьте это в gemfile

gem 'paperclip'
gem 'aws-sdk', '~> 2.3'

Затем установите пакет

config / environment / 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'),
  }
}

Кроме того, нам нужно установить переменные конфигурации AWS в приложении Heroku.

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
...