Каким образом поле для загрузки нескольких файлов HTML5 сопоставляется с вложенной моделью в Rails 3?
Я пытаюсь использовать атрибут HTML5 в поле файла во вложенной форме.
Модели выглядят следующим образом:
class Album < ActiveRecord::Base
has_many :album_images
has_many :images, :through => :album_images
accepts_nested_attributes_for :images
end
class Image < ActiveRecord::Base
has_many :album_images
has_many :albums, :through => :album_images
mount_uploader :filename, ImageUploader
validates_presence_of :filename
end
Вид:
<%= semantic_form_for @album, :url => upload_path do |f| %>
<%= f.inputs do %>
<%= f.input :name, :label => 'Album title' %>
<% end %>
<%= f.input :images, :as => :file, :input_html => {:multiple => true} %>
<%= f.buttons do %>
<%= f.commit_button 'Upload' %>
<% end %>
<% end %>
Когда я использую для поля файла:
<%= f.input :images, :as => :file, :input_html => {:multiple => true} %>
Я получаю:
<input id="album_images" multiple="multiple" name="album[images][]" type="file">
Что не кажется правильным, поскольку я думаю, что хочу установить имя файла непосредственно на объекте, но я не уверен в этом. Когда я пытаюсь загрузить с этим полем, входящие параметры выглядят так:
"album"=>{"name"=>"2011-01-09", "images"=>["IMG_0052.JPG", "IMG_0053.JPG", "IMG_0054.JPG", "IMG_0055.JPG"]}
Однако я получаю следующую ошибку:
ActiveRecord::AssociationTypeMismatch (Image(#2157004660) expected, got String(#2151988680)):
ОК, эта ошибка, вероятно, связана с тем, что она просто получила имя файла, а не объект изображения. Поэтому вместо этого я использую для поля файла:
<%= f.input :images, :as => :file, :input_html => {:multiple => true, :name => 'album[images][][filename]'} %>
для которого Formtastic генерирует:
<input id="album_images" multiple="multiple" name="album[images][][filename]" type="file">
Входящие параметры выглядят следующим образом:
"album"=>{"name"=>"2011-01-09", "images"=>[{"filename"=>"IMG_0052.JPG"}, {"filename"=>"IMG_0053.JPG"}, {"filename"=>"IMG_0055.JPG"}]}
Но тогда я получаю эту ошибку:
Image(#2153868680) expected, got ActiveSupport::HashWithIndifferentAccess(#2158892780)
Итак, как же вы можете настроить это множественное сопоставление ввода файлов в Rails?
Спасибо.
Ответы
Ответ 1
Вам нужно включить :html => { :multipart => true }
в ваш вызов form_for
(или в вашем случае semantic_form_for
), чтобы тэг <form>
был настроен на поддержку загрузки файлов.
Затем вернитесь к исходному синтаксису для f.input
, и вы должны быть правы.