Rails ActiveStorage 错误 - MessageVerifier-InvalidSignature

13

我正在处理一个项目,需要在Location模型上使用ActiveStoragehas_many_attached :photos

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

ActiveSupport::MessageVerifier::InvalidSignature in 
                                 LocationsController#attach_photo

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

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已经为我完成了这个任务。你也采用了这种方法吗?请查看此相关指南并告诉我:http://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads - 即使文档提到了上传到云端,它也可以与本地存储的文件一起工作。 - Jon M.
4个回答

27
在中一定要添加multipart: true,以生成enctype="multipart/form-data"。默认情况下,form_tag不会负责此操作(如果要附加文件),必须手动添加。

multipart/form-data 不编码任何字符。当使用具有文件上传控件的表单时,需要此值。

enter image description here

表单:

<%= 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方法,我们正在更新而不是创建幂等性

resources :locations do
  member do
    put :attach_photo
  end
end

我在使用form_for时读到过这个评论 - 我仍然犯了这个错误,而且我也设置了multipart: true... 但是它没有在html:选项中设置,所以它实际上没有做任何事情,因此省略了enctype="multipart/form-data"属性。我花了很长时间才意识到我必须移动它,并在此之前,我意识到我应该检查是否生成了enctype= html属性。 - Nitrodist
@Nitrodist form_for不生成,所以我在示例中使用了form_tag - 7urkm3n

2
你需要将签名(在params[:signed_blob_id]中)分配给实例,就像文档中的示例一样。
因此,操作如下:
@location.photos.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload

1
我使用以下内容解决了这个问题。

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

看起来空值引起了问题 "avatar"=>""

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

我的模型

class User < ApplicationRecord
  has_one_attached :avatar

0

Rails Active Storage + React Native + 启用网络检查的React Native调试器可能会导致此错误。

如果您正在使用React Native调试器并启用了网络检查,则文件上传可能无法正常工作,因为存在已知问题:Formdata在请求中发送[object object]

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接