Rails ActiveStorage错误 - MessageVerifier-InvalidSignature

sle*_*n36 6 ruby ruby-on-rails rails-activestorage

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

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

ActiveSupport::MessageVerifier::InvalidSignature in 
                                 LocationsController#attach_photo
Run Code Online (Sandbox Code Playgroud)

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

Location 模型

class Location < ApplicationRecord
  ...
  has_many_attached :photos
  ...
end
Run Code Online (Sandbox Code Playgroud)

地点控制器

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

视图

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

  <%= submit_tag "Upload" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

视图

resources :locations do
  member do
    post :attach_photo
  end
end
Run Code Online (Sandbox Code Playgroud)

7ur*_*m3n 10

确保添加multipart: trueform_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 %>
Run Code Online (Sandbox Code Playgroud)

也:

更改postput方法,我们正在更新不创建Idempotency

resources :locations do
  member do
    put :attach_photo
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 2

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

所以,像这样:

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