Ruby on rails 回形针未找到处理程序错误

Ruby on rails 回形针未找到处理程序错误,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 4,您好,我有两种型号产品和产品图像产品有许多产品图片。我用的是回形针 当我提交产品表单时会出现此错误 No handler found for ["0", {"product_image"=>#<ActionDispatch::Http::UploadedFile:0x007f8cb78b29c8 @tempfile=#<Tempfile:/var/folders/yx/znmx6qfj0c507bvkym6lvhxh0000gn/T/RackMultipart20151221-

您好,我有两种型号
产品
产品图像
<代码>产品有许多产品图片。我用的是回形针

当我提交
产品表单时
会出现此错误

No handler found for ["0", {"product_image"=>#<ActionDispatch::Http::UploadedFile:0x007f8cb78b29c8 @tempfile=#<Tempfile:/var/folders/yx/znmx6qfj0c507bvkym6lvhxh0000gn/T/RackMultipart20151221-46388-dqxfk7.jpg>, @original_filename="780069_black_l.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"product[product_images_attributes][0][product_image]\"; filename=\"780069_black_l.jpg\"\r\nContent-Type: image/jpeg\r\n">}]

  def create_product_images
    params["product"]["product_images_attributes"].each do |image|
      ProductImage.create(product_image: image, product_id: @form.product.id)
    end
  end
Product.rb

class Product < ActiveRecord::Base
  acts_as_taggable

  belongs_to :user
  belongs_to :category

  has_many :product_sizes
  has_many :product_images, :dependent => :destroy

  validates :title, presence: true, length: { maximum: 30 }
  validates :description, presence: true, length: { maximum: 2000 }
  validates :category, :user, :price, presence: true

  accepts_nested_attributes_for :product_images, allow_destroy: true
end
product_size.rb

class ProductSize < ActiveRecord::Base
  belongs_to :product
  belongs_to :size

  validates :quantity, presence: true
end

你没有数组,看起来像是散列

您的散列看起来像
{“ID”=>IMAGE}

尝试像这样迭代id和图像:

params["product"]["product_images_attributes"].each do |index, image|

为什么要循环使用参数并执行
create
方法

--

您应该能够通过
接受
的嵌套属性将
图像
传递到嵌套模型:

#app/models/product.rb
class Product < ActiveRecord::Base
   has_many :product_images
   accepts_nested_attributes_for :product_images, allow_destroy: true
end

#app/models/product_image.rb
class ProductImage < ActiveRecord::Base
   belongs_to :product
   has_attached_file :product_image
end
你的表格看起来不错


更新

好的,关于与图像一起保存
ProductSize
,您可以使用
accetps\u nested\u attributes\u for
同时保存它们

我一直主张使用它,而不是在create调用之后在
中创建自己的类,或者其他任何东西——保持流的一致性是您能做的最重要的事情

无论如何

#app/models/product.rb
class Product < ActiveRecord::Base
   has_many :product_images
   has_many :product_sizes
   accepts_nested_attributes_for :product_images, :product_sizes
end

#app/models/product_size.rb
class ProductSize < ActiveRecord::Base
   belongs_to :product
end

#app/models/product_image.rb
class ProductImage < ActiveRecord::Base
   belongs_to :product
   has_attached_image :image
end
#app/models/product.rb
类产品
这将允许您使用以下控制器设置:

#app/controllers/products_controller.rb
class ProductsController < ApplicationController
   def new
      @product = Product.new
      @product.product_images.build
      @product.product_sizes.build
   end

   def create
      @product = Product.new product_params
      @product.save
   end

   private

   def product_params
      params.require(:product).permit(:x, :y, :z, product_images_attributes: [:image], product_sizes_attributes: [:a, :b, :c])
   end
end
#app/controllers/products_controller.rb
类ProductsController<应用程序控制器
def新
@product=product.new
@product.product\u images.build
@product.product_size.build
结束
def创建
@产品=产品。新产品参数
@产品保存
结束
私有的
def产品参数
参数require(:product).permit(:x,:y,:z,产品图片属性:[:图片],产品大小属性:[:a,:b,:c])
结束
结束
这将允许您使用与当前类似的设置:

#app/views/products/new.html.erb
<%= form_for @product do |f| %>
   <%= f.fields_for :product_images do |p| %>
      <%= p.file_field :image %>
   <% end %>
   <%= f.fields_for :product_sizes do |s| %>
      <%= s.text_field :a %>
   <% end %>
   <%= f.submit %>
<% end %>
#app/views/products/new.html.erb

这将允许您使用所需的所有验证等,如果使用,您将能够根据需要添加额外的尺寸。

谢谢。我今天就来试试。你好,里奇。我调查过这件事。而且很确定它不会像那样工作。这是因为我有一个非常复杂的表单,使用表单对象来创建产品和产品大小。现在我正在尝试创建ProductImage。因此,当我转到product.product\u图像时,我会得到该产品的图像列表。我已经添加了我的产品控制器和产品表单。对我来说,它看起来像一个标准表单,为什么你要把它复杂化呢?我想我不能正常地做。我添加了我的产品型号和产品尺寸型号。用户进入表单。选择要上载的图像,选择哪个类别,如果衬衫的衬衫尺寸列表将下拉,并且在每个尺寸旁边都可以放入数量,则它们将填写表单的其余部分。除了图像,它都能正常工作。
ProductSize
来自哪里?图像模型是否取决于尺寸模型?谢谢。我今天要试试这个。
From: /Users/jo/Documents/Safsy/Website/Safsy/Safsy/app/controllers/products_controller.rb @ line 36 ProductsController#create:

    35: def create
 => 36:   binding.pry
    37:   @form = ProductForm.new(
    38:     product_image: product_params[:product_image],
    39:     title: product_params[:title],
    40:     price: product_params[:price],
    41:     size_description: product_params[:size_description],
    42:     shipping_description: product_params[:shipping_description],
    43:     description: product_params[:description],
    44:     tag_list: product_params[:tag_list],
    45:     category_id: product_params[:category_id],
    46:     sizes_by_id: product_params[:sizes_by_id],
    47:     user: current_user
    48:   )
    49:   if @form.save
    50:     create_product_images
    51:     redirect_to @form.product
    52:     flash[:success] = "You have created a new product"
    53:   else
    54:     flash[:danger] = "Your product didn't save"
    55:     new
    56:     render "new"
    57:   end
    58: end

[1] pry(#<ProductsController>)> params
=> {"utf8"=>"✓",
 "authenticity_token"=>"3MZESoSUgrO2Bc3vl8/M0pTfTna9rjeXfXG23znsy3VGCEBcHMh+4ZC5rqSxGkQOmz4kl1JN9FFMH4lniDjFQg==",
 "product"=>
  {"product_images_attributes"=>
    {"0"=>
      {"product_image"=>
        #<ActionDispatch::Http::UploadedFile:0x007f8c9ceb22f8
         @content_type="image/jpeg",
         @headers="Content-Disposition: form-data; name=\"product[product_images_attributes][0][product_image]\"; filename=\"780069_black_l.jpg\"\r\nContent-Type: image/jpeg\r\n",
         @original_filename="780069_black_l.jpg",
         @tempfile=#<File:/var/folders/yx/znmx6qfj0c507bvkym6lvhxh0000gn/T/RackMultipart20151222-46388-pgfg4b.jpg>>,
       "_destroy"=>"false"},
     "1450783221367"=>
      {"product_image"=>
        #<ActionDispatch::Http::UploadedFile:0x007f8c9ceb2140
         @content_type="image/jpeg",
         @headers="Content-Disposition: form-data; name=\"product[product_images_attributes][1450783221367][product_image]\"; filename=\"20090a.jpg\"\r\nContent-Type: image/jpeg\r\n",
         @original_filename="20090a.jpg",
         @tempfile=#<File:/var/folders/yx/znmx6qfj0c507bvkym6lvhxh0000gn/T/RackMultipart20151222-46388-3vamt4.jpg>>,
       "_destroy"=>"false"}},
   "category_id"=>"3",
   "title"=>"new product",
   "price"=>"352.40",
   "description"=>"test",
   "size_description"=>"test",
   "shipping_description"=>"test",
   "tag_list"=>"test"},
 "product_form"=>{"sizes_by_id"=>{"1"=>"3", "2"=>"34", "3"=>""}},
 "commit"=>"Create new product",
 "controller"=>"products",
 "action"=>"create"}
[2] pry(#<ProductsController>)> product_params
Unpermitted parameter: product_images_attributes
=> {"title"=>"new product",
 "price"=>"352.40",
 "description"=>"test",
 "tag_list"=>"test",
 "category_id"=>"3",
 "size_description"=>"test",
 "shipping_description"=>"test",
 "sizes_by_id"=>{"1"=>"3", "2"=>"34", "3"=>""}}
[3] pry(#<ProductsController>)>
  def product_params
     params.require(:product).permit(
      :title,
      :price,
      :description,
      :tag_list,
      :category_id,
      :size_description,
      :shipping_description,
      product_images_attributes: [:product_image, :_destroy],
      product_sizes_attributes: [:size_id, :quantity]
    )
  end
params["product"]["product_images_attributes"].each do |index, image|
#app/models/product.rb
class Product < ActiveRecord::Base
   has_many :product_images
   accepts_nested_attributes_for :product_images, allow_destroy: true
end

#app/models/product_image.rb
class ProductImage < ActiveRecord::Base
   belongs_to :product
   has_attached_file :product_image
end
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
   def new
      @product = Product.new 
      @product.product_images.build
   end

   def create
      @product = Product.new product_params
      @product.save
   end

   private

   def product_params
      params.require(:product).permit(:product, :params, product_images_attributes: [:product_image] %>
   end
end
#app/models/product.rb
class Product < ActiveRecord::Base
   has_many :product_images
   has_many :product_sizes
   accepts_nested_attributes_for :product_images, :product_sizes
end

#app/models/product_size.rb
class ProductSize < ActiveRecord::Base
   belongs_to :product
end

#app/models/product_image.rb
class ProductImage < ActiveRecord::Base
   belongs_to :product
   has_attached_image :image
end
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
   def new
      @product = Product.new
      @product.product_images.build
      @product.product_sizes.build
   end

   def create
      @product = Product.new product_params
      @product.save
   end

   private

   def product_params
      params.require(:product).permit(:x, :y, :z, product_images_attributes: [:image], product_sizes_attributes: [:a, :b, :c])
   end
end
#app/views/products/new.html.erb
<%= form_for @product do |f| %>
   <%= f.fields_for :product_images do |p| %>
      <%= p.file_field :image %>
   <% end %>
   <%= f.fields_for :product_sizes do |s| %>
      <%= s.text_field :a %>
   <% end %>
   <%= f.submit %>
<% end %>