mohnstrudel
mohnstrudel

Reputation: 649

Triple nested form multiple image upload using jquery and carrierwave

I'm following this tutorial - http://alagram.github.io/blog/2013/11/04/uploading-multiple-files-with-carrierwave-and-a-nested-form/

And receive this error:

TypeError at /products
no implicit conversion of String into Integer

Better errors highlights this line:

@product = Product.new(product_params)

This is my POST log:

Started POST "/products" for ::1 at 2015-08-13 11:59:24 +0300
Processing by ProductsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"sYWHbXoRQtxsUTU+JmJ4fZagrSoQjE779QPrgQdI1Fn0C0O2sa5vPdU7CSnMSkbH2ulDQcTjrKknFLPEIw7NXw==", "product"=>{"title"=>"hdgsdf", "description"=>"", "advertising_text"=>"", "fancy_quote"=>"", "category_id"=>"2", "subcategory_id"=>"1", "volume_ids"=>[""], "options_attributes"=>{"0"=>{"price"=>"", "size"=>"", "weight"=>"", "material"=>""}, "option_pics_attributes"=>[{"product_image"=>"00026708.jpg"}, {"product_image"=>"475614.jpg"}]}}, "commit"=>"Create Product"}
Unpermitted parameter: 0
Completed 500 Internal Server Error in 2ms

I assume, that general logic is correct since there are indeed two images in my params. My further assumption is, that my strong params are somewhat not correct. I've read, that to allow arrays you should use a hash in the strong params and to allow hash you should use an array. I tried all possible combinations and right now I'm confused.

Strong params:

def product_params
    params.require(:product).permit(
    :title, :description, :advertising_text, :fancy_quote, :product_size_ids, { volume_ids: [] }, :category_id, :subcategory_id, 
    options_attributes: [:size, :weight, :price, :material, :product_id, 
      option_pics_attributes: [ :product_image, :option_id ] ])
end

Rest of my code for the record:

new.html.haml - form

=form_for @product, url: products_path do |f|
    %p
        =f.label :title
        =f.text_field :title
        %br
        =f.label :description
        =f.text_area :description
        %br
        =f.label :advertising_text
        =f.text_area :advertising_text
        %br
        =f.label :fancy_quote
        =f.text_area :fancy_quote
        %br
        =f.label :category_id
        =f.collection_select :category_id, Category.all, :id, :title, { prompt: 'Please select category' }
        %br
        =f.label :subcategory_id
        =f.collection_select :subcategory_id, Subcategory.all, :id, :title, { prompt: 'Please select sub-category' }
        %br
        =f.label 'Product Size'
        =f.collection_check_boxes(:volume_ids, Volume.all, :id, :value)

    %p
        = f.fields_for :options do |builder|
            =builder.label :price
            =builder.text_field :price
            %br
            =builder.label :size
            =builder.text_field :size
            %br
            =builder.label :weight
            =builder.text_field :weight
            %br
            =builder.label :material
            =builder.text_field :material
            %br
            =fields_for :option_pic, OptionPic.new, html: { multipart: true, id: "fileupload"  } do |op|
                = op.label 'Upload image'
                = op.file_field :product_image, multiple: true, name: "product[options_attributes][option_pics_attributes][][product_image]", id: 'fileupload'
    =f.submit id: 'submit-data'

products.coffee:

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/

jQuery ->
    $('#fileupload').fileupload()
    add: (e, data) ->
    data.context = $("#submit-data")
    data.submit()

Models:

class OptionPic < ActiveRecord::Base
    mount_uploader :product_image, ProductImageUploader
    belongs_to :option
end

class Option < ActiveRecord::Base
    belongs_to  :product
    has_many    :option_pics

    accepts_nested_attributes_for :option_pics
end

class Product < ActiveRecord::Base

    belongs_to  :category 
    belongs_to  :subcategory
    has_many    :options
    has_many    :voluminazations

    has_many    :volumes, through: :voluminazations

    accepts_nested_attributes_for :options

end

The basic logic for my app is following: I have a product (say, a t-shirt "mercury t-bone", this t-shirt can have many options (say, green, blue, yellow) and for each option I want to upload multiple pics (thus, option_pics - say 4 pics for the green option, 5 for blue option and 2 pictures for the yellow option)

Upvotes: 1

Views: 73

Answers (0)

Related Questions