Rails ActiveStorage错误 - MessageVerifier-InvalidSignature

时间:2018-05-23 08:51:23

标签: ruby-on-rails ruby rails-activestorage

我正在处理一个需要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 个答案:

答案 0 :(得分:7)

确保在multipart: true中添加form_tag。它会生成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方法,我们正在更新未创建Idempotency

resources :locations do
  member do
    put :attach_photo
  end
end

答案 1 :(得分:0)

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

所以,像这样:

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我用这个解决了这个问题


  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