После обновления моего приложения до 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">