У меня есть форма, в которой пользователь выбирает файл для загрузки. Файл загружается после того, как файл выбран с помощью прямых загрузок 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
Я должен отдельно присвоить модели значение атрибута файла, чтобы другие атрибуты были назначены до того, как возникнет ошибка.
Это работает, поскольку он возвращает экземпляр модели, которая была настроена до возникновения ошибки, а проверка файла проверяет наличие пустого значения файла. Однако так ли это на самом деле и есть ли способ лучше, который используют более опытные и опытные разработчики?