12

我正在做一个需要模型ActiveStorage has_many_attached :photos情况的项目Location

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

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
4

4 回答 4

24

确保添加multipart: true. form_tag它生成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,我们正在更新而不是创建幂等性

resources :locations do
  member do
    put :attach_photo
  end
end
于 2018-06-30T08:15:26.053 回答
2

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

所以,像这样:

@location.photos.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload
于 2018-06-30T00:55:53.670 回答
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
于 2021-06-16T14:23:51.693 回答
0

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

如果您将React Native 调试器与 一起使用Network Inspect Enabled,则文件上传可能无法正常工作,因为这个已知问题:Formdata 在 request 中发送 [object object]

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

于 2021-05-24T09:36:27.930 回答