У меня есть форма, где пользователь выбирает файл для загрузки.Файл загружается после выбора файла с помощью прямой загрузки 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
Моя попытка справиться с этой проблемой - создать свой собственный метод 'build' и использовать его вместостандарт «новый», потому что «новый» вызывает ошибку в моем контроллере, и я хочу устранить эту проблему в модели.
Метод «сборки» в моей модели:
def self.build(params)
pd = self.new params.except(:file)
pd.file = params[:file]
pd
rescue ActiveSupport::MessageVerifier::InvalidSignature => e
pd
end
Мне нужно отдельно присвоить значение атрибута файла модели, чтобы другие атрибуты были назначены до возникновения ошибки.
Это работает, поскольку возвращает экземпляр модели, которая была настроена до возникновения ошибки, ипроверка файла проверяет наличие пустого значения файла.Однако действительно ли это правильно и есть ли лучший способ, которым пользуются более опытные и опытные разработчики?