rails-activestorage - 如何处理 ActiveStorage 直接上传的 ActiveSupport::MessageVerifier::InvalidSignature 错误
问题描述
我有一个表单,用户可以在其中选择要上传的文件。使用 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
我必须将文件属性值单独分配给模型,以便在引发错误之前分配其他属性。
这有效,因为它返回在错误发生之前设置的模型实例,并且文件验证检查是否存在空文件值。但是,这真的正确吗?有没有更好的方法让更有经验和技术的开发人员正在使用?
解决方案
出于某种原因,这解决了我的问题。
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
推荐阅读
- python - 在 Windows 机器上运行 TheHarvester 工具:找不到 python 模块
- python - 在python中绘制正交距离
- flutter - 在 Flutter / Dart 中将地图中的列表添加到 ListView
- javascript - 用 => 定义的函数如何在 Angular 中被调用?
- django - 在弹性beantalk中设置静态文件
- javascript - 父类的泛型类型 javascript
- python-3.x - 查找列表和列表列表元素之间的部分字符串匹配
- javascript - 如何为引导模式内的 ng-select 添加自动对焦
- javascript - 使用 JavsScript 将宽度设置为跨度不起作用
- api - 如何将相机捕获的图像传递到服务器?