Активное хранилище в удаленной истинной форме. Ошибка неверной аутентичности и неправильный формат контроллера - PullRequest
0 голосов
/ 07 ноября 2018

После обновления моего приложения до Rails 5.2 я нашел время, чтобы взглянуть на Active Storage. Следуя руководству, я установил его и выполнил необходимые миграции.

На моей пользовательской модели я хочу прикрепить аватар в соответствии с примером здесь: Руководство по Edge для активного хранилища

Ошибка, которую я получаю при отправке формы: ActionController::InvalidAuthenticityToken

<%= form_for @user, remote: true do |f| %>
  <%# Other user fields redacted %>

  <div class="form-group">
    <%= f.label :avatar %>
    <%= f.file_field :avatar %>
  </div>

  <%= f.submit "Save", remote: true %>

<% end %>

Я изменил форму для включения authenticity_token: true следующим образом:

<%= form_for @user, remote: true, authenticity_token: true do |f| %>

Это устранило мою ошибку подлинности и вставило файл в мою БД, однако это вызвало ошибку неизвестного формата, так как он направляется на мой контроллер с помощью html вместо js.

Журналы:

Started PATCH "/users/22" for 127.0.0.1 at 2018-11-07 13:36:22 +0000
Processing by UsersController#update as HTML

Disk Storage (5.7ms) Uploaded file to key: aJQ3m2skk8zkHguqvhjV6tNk (checksum: 7w6T1YJX2LNIU9oPxG038w==)
ActiveStorage::Blob Create (23.6ms)  INSERT INTO `active_storage_blobs` (`key`, `filename`, `content_type`, `metadata`, `byte_size`, `checksum`, `created_at`) VALUES ('aJQ3m2skk8zkHguqvhjV6tNk', 'Dq3gtJjU0AAbdIj.jpg-large.jpeg', 'image/jpeg', '{\"identified\":true}', 50642, '7w6T1YJX2LNIU9oPxG038w==', '2018-11-07 13:36:22')
ActiveStorage::Attachment Create (3.4ms)  INSERT INTO `active_storage_attachments` (`name`, `record_type`, `record_id`, `blob_id`, `created_at`) VALUES ('avatar', 'User', 22, 1, '2018-11-07 13:36:22')
 (9.4ms)  ROLLBACK
Completed 406 Not Acceptable in 630ms (ActiveRecord: 93.1ms)

ActionController::UnknownFormat (ActionController::UnknownFormat):

Пользователи # Обновление

def update
  respond_to do |format|

    if @user.update(user_params)
      flash.now[:notice] = 'User saved successfully!'
      format.js do
        @users = User.all
      end
    else
      flash.now[:alert] = @user.errors.full_messages.to_sentence
      format.js do
        @users = User.all
        render layout: false, content_type: 'text/javascript'
      end
    end

  end
end

Есть идеи, почему он представляется в виде HTML вместо JS?

Редактировать: Разметка формы

<form class="edit_user" id="edit_user_22" enctype="multipart/form-data" action="/users/22" accept-charset="UTF-8" data-remote="true" method="post">

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Также перешел в Active Storage и застрял здесь. Но (как я помнил) в моей предыдущей реализации, где я использовал github / jQuery-File-Upload , я решил (как оказалось) ту же проблему:

Rails.fire($("#form_id")[0], 'submit');

Это rails-ujs метод, который я получил из этого Q / A: / with-rails-ujs-how-to-submit-a-remote-form-from-a- функция

Как я понял сейчас, все это вытекает из того факта, что:

Событие - submit - не возникает при непосредственном вызове метода form.submit (), - MDN:
- https://developer.mozilla.org/en-US/docs/Web/Events/submit
- https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
- https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript

0 голосов
/ 09 ноября 2018

После долгих проб и ошибок потребовалось использовать функцию прямой загрузки Active Storage, чтобы это работало. Позвольте мне объяснить мои выводы:

remote: true, multipart: true не очень хорошо играют вместе. См. Этот пост переполнение стека для более подробной информации. По сути, вам нужно использовать jQuery или гем для удаленной отправки файлов.

После этой записи edgeguides (прямые загрузки). Кажется, как будто при нажатии на кнопку отправить; прямая загрузка перехватит событие отправки и отправит файл непосредственно на облачный сервер (или локально в моем случае разработчика). Затем он будет использовать ссылку этого изображения в форме отправки вместо отправки фактического изображения.

Это ударил мой Users#update с помощью JS и успешно подключил аватар.

...