Как обрабатывать ошибки ActiveSupport :: MessageVerifier :: InvalidSignature для прямых загрузок ActiveStorage

У меня есть форма, в которой пользователь выбирает файл для загрузки. Файл загружается после того, как файл выбран с помощью прямых загрузок ActiveStorage. Есть кнопка отправки, на которую нельзя нажать, пока загрузка не будет завершена.

Кнопка неактивна при загрузке формы. Однако, если по какой-то причине пользователь смог нажать кнопку без предварительного выбора файла, я получаю следующую ошибку в моем контроллере:

ActiveSupport::MessageVerifier::InvalidSignature - ActiveSupport::MessageVerifier::InvalidSignature:

Я хочу убедиться, что мое приложение работает надежно, поэтому я хочу знать, как справиться с этой ошибкой.

Вот мой метод контроллера:

def create
  authorize [:proofreaders, :proofread_document]
  @proofread_document = ProofreadDocument.build(proofread_document_params.merge(uploader: current_user, proofreading_job: @proofreading_job))
  if @proofread_document.save
    flash[:notice] = I18n.t('success.upload', resource: @proofread_document.file.filename)
    render :create, layout: false
  else
    render :new, layout: false
  end
end

Моя попытка решить эту проблему - создать свой собственный метод «сборки» и использовать его вместо стандартного «нового», потому что «новый» вызывает ошибку в моем контроллере, и я хочу разобраться с этим в модели.

Метод сборки в моей модели:

  def self.build(params)
    pd = self.new params.except(:file)
    pd.file = params[:file]
    pd
  rescue ActiveSupport::MessageVerifier::InvalidSignature => e
    pd
  end

Я должен отдельно присвоить модели значение атрибута файла, чтобы другие атрибуты были назначены до того, как возникнет ошибка.

Это работает, поскольку он возвращает экземпляр модели, которая была настроена до возникновения ошибки, а проверка файла проверяет наличие пустого значения файла. Однако так ли это на самом деле и есть ли способ лучше, который используют более опытные и опытные разработчики?


person chell    schedule 03.03.2019    source источник


Ответы (2)


Способ, которым я знаю, как решить эту проблему, - это изменить параметры, чтобы отклонить пустые значения. Например

params[:user].delete(:avatar) if params[:user][:avatar].blank?

Это работает, но это затруднит просмотр действий вашего контроллера. Я хочу решить эту проблему на стороне модели, поэтому я сделаю это и расскажу вам, как это получается.

person yungindigo    schedule 26.05.2021

По какой-то причине это решило мою проблему.


  def user_params
    params.permit(
      :id, :name, :email, :username, :country, :avatar, :id_number, :license_number
    ).select {|x,v| v.present?}
  end

Похоже, проблема связана с пустым значением

 "id_number"=>"234545", "license_number"=>"234545", "avatar"=>""

Моя модель

class User < ApplicationRecord
  has_one_attached :avatar
person illusionist    schedule 16.06.2021