Rails ActiveStorage 错误 - MessageVerifier-InvalidSignature

Posted

技术标签:

【中文标题】Rails ActiveStorage 错误 - MessageVerifier-InvalidSignature【英文标题】:Rails ActiveStorage Error - MessageVerifier-InvalidSignature 【发布时间】:2018-11-02 04:18:23 【问题描述】:

我正在处理一个需要Location 模型上的ActiveStorage has_many_attached :photos 情况的项目。

我在下面设置了代码,但是在尝试上传表单时,我收到以下错误:

ActiveSupport::MessageVerifier::InvalidSignature in 
                                 LocationsController#attach_photo

这是将文件“添加”到特定父记录(即:Location 记录)的附件集中的方法吗?

Location模特

class Location < ApplicationRecord
  ...
  has_many_attached :photos
  ...
end

位置控制器

class LocationsController < ApplicationController
  ...
  def attach_photo
    @location = Location.find(params[:id])
    @location.photos.attach(params[:photo])
    redirect_to location_path(@location)
  end
  ...
end

查看

<%= form_tag attach_photo_location_path(@location) do %>
  <%= label_tag :photo %>
  <%= file_field_tag :photo %>

  <%= submit_tag "Upload" %>
<% end %>

查看

resources :locations do
  member do
    post :attach_photo
  end
end

【问题讨论】:

我最近使用了 ActiveStorage 的直接上传功能。我喜欢这种方法的地方在于我不必编写任何代码来处理实际上传本身,Rails 为我完成了。你是否也采用了这种方法?请参阅此处的相关指南并让我知道:edgeguides.rubyonrails.org/… - 即使文档中提到了上传到云端,它也适用于本地存储的文件。 【参考方案1】:

确保在form_tag 中添加multipart: true。它生成enctype="multipart/form-data"

form_tag默认不负责,必须有(如果附加文件)。

multipart/form-data 没有字符被编码。此值是必需的 当您使用具有文件上传控件的表单时

表格:

<%= form_tag attach_photo_location_path(@location), method: :put, multipart: true do %>
  <%= label_tag :photo %>
  <%= file_field_tag :photo %>

  <%= submit_tag "Upload" %>
<% end %>

还有:

post 更改为put 方法,我们正在更新而不是创建Idempotency

resources :locations do
  member do
    put :attach_photo
  end
end

【讨论】:

【参考方案2】:

您需要将签名(在params[:signed_blob_id] 中)分配给实例,如the docs 中的示例所示。

所以,像这样:

@location.photos.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload

【讨论】:

【参考方案3】:

我用这个解决了这个问题


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

看起来空值导致问题"avatar"=&gt;""

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

我的模型

class User < ApplicationRecord
  has_one_attached :avatar

【讨论】:

【参考方案4】:

启用 Network Inspect 的 Rails Active Storage + React Native + React Native 调试器可能会导致此错误。

如果您将React Native debugger 与Network Inspect Enabled 一起使用,则由于以下已知问题,文件上传可能无法正常工作:Formdata sends [object object] in request。

在使用 React Native 调试器时关闭 Network Inspect。您可以改为使用 Reactotron 检查网络负载。

【讨论】:

以上是关于Rails ActiveStorage 错误 - MessageVerifier-InvalidSignature的主要内容,如果未能解决你的问题,请参考以下文章

上传前的 Rails 5.2 ActiveStorage 裁剪附件

在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

升级到 Rails 6.1.0 后 ActiveStorage::Blob 的未定义方法“service_name”

Rails activestorage 不适用于 shopify_app gem

Rails 5.2 + Trix + ActiveStorage

如何在 Rails 中正确使用 ActiveStorage 进行模型测试?