Ошибка Rails ActiveStorage — MessageVerifier-InvalidSignature

Я работаю над проектом, который требует 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

person slehmann36    schedule 23.05.2018    source источник
comment
Недавно я использовал функцию прямой загрузки ActiveStorage. Что мне нравится в этом подходе, так это то, что мне не нужно писать код для обработки самой фактической загрузки, Rails делает это за меня. Вы тоже использовали этот подход? См. соответствующее руководство здесь и дайте мне знать: edgeguides.rubyonrails.org/ — несмотря на то, что в документах есть ссылка на загрузку в облако, она также будет работать с локально сохраненными файлами.   -  person Jon M.    schedule 29.06.2018


Ответы (4)


Обязательно добавьте 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
person 7urkm3n    schedule 30.06.2018

Вам необходимо назначить подпись (в params[:signed_blob_id]) экземпляру, как пример из документы иллюстрируют.

Ну вот так:

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

Эта ошибка может быть вызвана отладчиком Rails Active Storage + React Native + React Native с включенным Network Inspect.

Если вы используете отладчик React Native с Network Inspect Enabled, загрузка файлов может не работать, потому что этой известной проблемы: Formdata отправляет [object object] в запросе.

Отключите Network Inspect при использовании отладчика React Native. Вместо этого вы можете проверить полезную нагрузку сети с помощью Reactotron.

person glinda93    schedule 24.05.2021

Я решил эту проблему, используя это


  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
person illusionist    schedule 16.06.2021