ActiveStorage
モデルでLocation
has_many_attached :photos
シチュエーションを必要とするプロジェクトに取り組んでいます。
以下にコードを設定しましたが、フォームをアップロードしようとすると、次のエラーが表示されます。
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
必ず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
署名を割り当てる必要があります(params[:signed_blob_id]
) docs からの例が示すようにインスタンスに。
だから、このように:
@location.photos.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload