Take the 2-minute tour ×

I'm trying to create a simple rails 3.2 app.

To keep it simple, the app has two models: Product and Image

The Product should have many Images, so here are my models:

class Product < ActiveRecord::Base
  has_many :images, :class_name => 'Image'

class Image < ActiveRecord::Base
  belongs_to :product
  has_attached_file :image, :styles => { :normal => "300x300", :small => "70x70" }

I'm using active_admin and here is my form to create a product:

  <%= semantic_form_for [:admin, @product], :html => {:multipart => true} do |f| %>

    <%= f.inputs :title, :description, :price %>

    <%= f.semantic_fields_for :images do |f2| %>
        <%= f2.file_field :image %>
    <% end %>

    <%= f.buttons :commit %>
  <% end %>

When I submit the form, I get the following exception:

Image(#70365286921100) expected, got Array(#70365535770260)

 "images"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x007ffe63d19e58 @original_filename="IMG_0097.JPG",
 @headers="Content-Disposition: form-data; name=\"product[images][image]\"; filename=\"IMG_0097.JPG\"\r\nContent-Type: image/jpeg\r\n",
 "commit"=>"Create Product"}

Why is it happening? Can anyone please help me out?

Thanks in advance!

share|improve this question

1 Answer 1

I believe you need accepts_nested_attributes_for :images in your Product model. The Product model should look like:

class Product < ActiveRecord::Base
  has_many :images, :class_name => 'Image'
  accepts_nested_attributes_for :images

If you look at your params hash, you see:

"images"=>{"image"=> ...

What accepts_nested_attributes_for does is to change the structure of your params to accommodate the one-to-many relationship specified by the has_many :images association.

Supposing you have more than one image in the form, your params hash would contain:

"images_attributes"=>{"0"=>{"image"=> ...  }, "1"=>{"image" => ... }, ...}

Also, make sure you call @product.images.build somewhere before you reach the view if the @product is new.

share|improve this answer

Your Answer


