Вложенная загрузка нескольких файлов Rails на amazon s3 с использованием s3_file_field

Я пытался заставить загрузку нескольких изображений работать над вложенной моделью в рельсах. Я использую гем s3_file_field, который можно найти здесь.

Я создал список, в котором показаны соответствующие части моего кода, доступные здесь.

Когда я пытаюсь загрузить два изображения, оба изображения загружаются на S3, но в базу данных сохраняется только один объект изображения. Мне нужно найти способ создать объект изображения для каждого изображения, загружаемого на S3.


person user3903221    schedule 19.08.2014    source источник
comment
Вложенные модели и формы заставляют меня съеживаться. Когда у вас есть такой уровень сложности, вам, вероятно, следует создать новый объект для его обработки. Попробуйте объекты формы - см. другой ответ здесь: stackoverflow.com/a/25298020/1448966   -  person A Fader Darkly    schedule 19.08.2014


Ответы (1)


я поднял аналогичный вопрос здесь....используйте paperclip >= 4 вместе с s3, чтобы все заработало.

class Image < ActiveRecord::Base
  has_many :image_photos , :dependent => :destroy
  accepts_nested_attributes_for :image_photos, :reject_if => lambda { |a| a[:avatar].blank? }, :allow_destroy => true
end


class ImagePhoto < ActiveRecord::Base
 belongs_to :image
 has_attached_file :avatar,
  :styles => {:view => "187x260#"},
  :storage => :s3,
  :s3_permissions => :private,
  :s3_credentials => S3_CREDENTIALS
 attr_accessible :image_id,:avatar,:avatar_file_name,:avatar_content_type,:avatar_file_size,:avatar_updated_at
 validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
 validates_presence_of :avatar
end

в контроллере

 def new
if current_or_guest_user.pic_categories.present?
 @image = Image.new
 #3.times {@image.image_assets.build} # added this
 @image.image_photos.build

end 

 def create
@image = Image.new(params[:image])
@image.user_id = current_or_guest_user.id
 if @image.save
   if params[:image_photos][:avatar]
     params[:image_photos][:avatar].each { |image|
       @image.image_photos.create(avatar: image)
       }
      end
@image.create_activity key: 'image.create', owner: current_or_guest_user
end

_form.html.erb

<%= form_for(@image,:html=>{:multipart => true,:remote=>true,:class=>"form-horizontal",:role=>"form"}) do |f |%>
 <%= f.fields_for :image_photos do |builder| %>
<% if builder.object.new_record? %>
   Upload picture
  <!-- to add multiple images--> 
  <%= builder.file_field :avatar,:multiple=>"true",:name=>"image_photos[avatar]  []",:class=>"opacity"%></a>
 <%end%>


<%end%>
person Milind    schedule 19.08.2014