14

ネストされたフォームのファイル フィールドで HTML5 の multiple 属性を使用しようとしています。

モデルは次のとおりです。

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)):

OK、そのエラーはおそらく画像オブジェクトではなくファイル名を受け取ったという事実によるものです。代わりに、ファイルフィールドに次を使用します。

<%= 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 でこの複数ファイル入力フィールド マッピングを設定するにはどうすればよいでしょうか。

ありがとう。

4

1 に答える 1

2

タグがファイルのアップロードをサポートするように設定されるよう:html => { :multipart => true }に、form_for(またはあなたの場合はsemantic_form_for) 呼び出しに含める必要があります。<form>

次に、元の構文に戻りますf.input。そのときは正しいはずです。

于 2011-04-14T16:16:05.893 に答える