1

私はこのチュートリアルに従っています - http://alagram.github.io/blog/2013/11/04/uploading-multiple-files-with-carrierwave-and-a-nested-form/

そして、このエラーを受け取ります:

TypeError at /products
no implicit conversion of String into Integer

より良いエラーは、次の行を強調表示します。

@product = Product.new(product_params)

これは私の POST ログです:

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

私のパラメータには実際に2つの画像があるので、一般的なロジックは正しいと思います。私のさらなる仮定は、私の強力なパラメーターが多少正しくないということです。配列を許可するには、強力なパラメーターでハッシュを使用する必要があり、ハッシュを許可するには、配列を使用する必要があることを読みました。考えられるすべての組み合わせを試しましたが、今は混乱しています。

強力なパラメーター:

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

記録のための残りのコード:

new.html.haml - フォーム

=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()

モデル:

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

私のアプリの基本的なロジックは次のとおりです。私は製品を持っています (たとえば、T シャツ「マーキュリー T ボーン」、この T シャツには多くのオプション (たとえば、緑、青、黄色) があり、必要なオプションごとに複数の写真をアップロードするには (つまり、option_pics - 緑のオプションに 4 つの写真、青のオプションに 5 つの写真、黄色のオプションに 2 つの写真)

4

0 に答える 0