我正在处理一个需要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
答案 0 :(得分:7)
确保在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
方法,我们正在更新未创建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 debugger 与 Network 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