Я хочу сохранить некоторые изображения в модели, используя форму динамического кокона с Active Storage для обработки файлов.
У меня есть класс фермера, в котором много яблок, и фермер может добавить несколько изображений для каждого из разных видов яблок через форму фермера.
class Farmer < ActiveRecord::Base
has_many :apples, inverse_of: :farmer
accepts_nested_attributes_for :apples, allow_destroy: true,
reject_if: :all_blank
end
class Apple < ActiveRecord::Base
has_many_attached :apple_images
end
Внутри контроллера фермера у меня есть:
class Farmer < ApplicationController
def update
@farmer = Farmer.find(params[:farmer_id])
if @farmer.valid?
@farmer.update!(farmer_params)
redirect_to edit_farmer_path(farmer_id: @farmer.id)
else
...
...
end
end
private
def farmer_params
params.require(:farmer).permit(
:farmer_name,
apples_attributes: [
:id,
:color,
:size,
:_destroy
])
end
end
на мой взгляд, я только что добавил это в свои поля кокона
<div class="form-field">
<%= f.label :apple_images, "Please upload apple images" %>
<%= f.file_field :apple_images, multiple: true, data: { validates: {required: {}} } %>
</div>
Теперь cocoon сохранит атрибуты яблока с помощью вызова accepts_nested_attributes_for
после сохранения объекта фермера. Все работает нормально, пока я не попытался добавить apple_images
в форму.
Читая файл readme для Active Storage, я вижу, что он предлагает вам прикрепить файлы сразу после того, как элемент был сохранен.
Вы можете прочитать здесь
но вкратце, если вы хотите, чтобы в контроллере было одно изображение, сделайте следующее:
#inside an update method
Current.user.avatar.attach(params.require(:avatar))
или если вам нужно несколько изображений:
def create
message = Message.create! params.require(:message).permit(:title, :content)
message.images.attach(params[:message][:images])
redirect_to message
end
Это кажется довольно простым, когда изображение находится непосредственно на модели, которую я сохраняю в контроллере.
Сначала я подумал, что это может быть так же просто, как добавить apple_images в параметры следующим образом:
def farmer_params
params.require(:farmer).permit(
:farmer_name,
apples_attributes: [
:id,
:color,
:size,
:apple_images,
:_destroy
])
end
но это вернет ошибку:
ActiveModel::UnknownAttributeError - unknown attribute 'apple_images' for Apple.:
Я думаю об использовании обратного вызова after_save в модели яблока, чтобы прикрепить изображения после обновления / создания объекта яблока. Хотя я тоже не знаю, как этого добиться.
Чувствуя себя немного потерянным, мы будем очень благодарны за любые идеи или предложения
ИЗМЕНИТЬ
Вот как выглядят параметры во время обновления:
<ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch",
"farmer"=>{"farmer_name"=>"billy the farmer", "apples_attributes"=>
{"0"=>{"color"=>"Green",
"size"=>"A",
"apple_images"=>[#<ActionDispatch::Http::UploadedFile:0x007f9e8aa93168 @tempfile=#<Tempfile:/var/folders/n7/65r5561n44q0w4bdnmw42l880000gn/T/RackMultipart20171211-87415-1m2w7gh.png>, @original_filename="Screen Shot 2017-12-07 at 09.13.28.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"farmer[apples_attributes][0][apple_images][]\"; filename=\"Screen Shot 2017-12-07 at 09.13.28.png\"\r\nContent-Type: image/png\r\n">,
#<ActionDispatch::Http::UploadedFile:0x007f9e8aa93118 @tempfile=#<Tempfile:/var/folders/n7/65r5561n44q0w4bdnmw42l880000gn/T/RackMultipart20171211-87415-1gdbax2.jpeg>, @original_filename="WhatsApp Image 2017-12-06 at 1.23.35 PM.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"farmer[apples_attributes][0][apple_images][]\"; filename=\"WhatsApp Image 2017-12-06 at 1.23.35 PM.jpeg\"\r\nContent-Type: image/jpeg\r\n">],
"_destroy"=>"false", "id"=>"4"}}},
"commit"=>"Next",
"controller"=>"farmer/produce",
"action"=>"update",
"farmer_id"=>"3"} permitted: false>
apple images
переместится вместе с остальными параметрами яблока, которые будут сохранены через фермераaccepts_nested_attributes_for
. ActiveStorage хочет, чтобы изображения были прикреплены к объектам после сохранения. Я считаю, что ActiveStorage устанавливает полиморфные таблицы. Мне было интересно, могу ли я передать изображения яблока в класс Apple вне атрибутов яблока, чтобы мы могли настроить обратный вызов after_save для прикрепления изображений? - person TheLegend   schedule 12.12.2017