Ruby Rails 4 和回形针
Ruby on Rails 4 and Paperclip
我正在 rails 中构建一个项目,它是一家公司的虚拟商店。用户应该能够注册新产品和上传图片,所以我生成了 2 个模型:"Product" 和 "Image"、产品 has_many 图片和图片 belongs_to 产品,我已经 运行 回形针来更新图像。 “accepts_nested_attributes_for :images
”在产品模型中,因此我可以保存来自同一产品表单的图像。问题是图像没有被保存。用户应该能够上传 3 张图片(这是我允许的方式“3.times {@product.images.build}
”)。这是我的产品控制器:
def new
@product = Product.new
3.times {@product.images.build}
end
def create
@product = Product.new(params[:product])
if @product.save
redirect_to :root
else
render :action => 'new'
end
end
我也试过这样定义 product_params 方法:
private
def product_params
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])
end
这是控制台抛出的Request信息:
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"qRyYjG9pSaFxgCtMddDN3fpbsTeIAagLEz+psd+Z+oHa2AVjXpXYcbxta/Egj2TGrmF3FFNCllkY54dig3aN8g==",
"product"=>{"title"=>"Title",
"info"=>"Infor",
"description"=>"Description",
"price"=>"9",
"images_attributes"=>{"0"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d830 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-h6wdta.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][0][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
"1"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d704 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-19t1r3v.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][1][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
"2"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d650 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-fj3w5g.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][2][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">}}},
"commit"=>"Submit"}
如果我在 @product = Product.new(product_params)
中将方法 product_params
作为参数传递,它会保存标题、描述和价格,但不会保存图片。
你保留了 :images_attributes => []
但它应该是 :images_attributes => [:image]
所以,改变这个:
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])
至:
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [:image])
在您的 product_params
方法中。
之后应该可以了!
对于图像验证,使用这个:
validates_attachment_presence :image
如果此验证不起作用,请尝试使用这样的自定义验证:
validate :image_present
def image_present
if image_file_name.blank?
errors.add(:image, :image not present")
end
end
我正在 rails 中构建一个项目,它是一家公司的虚拟商店。用户应该能够注册新产品和上传图片,所以我生成了 2 个模型:"Product" 和 "Image"、产品 has_many 图片和图片 belongs_to 产品,我已经 运行 回形针来更新图像。 “accepts_nested_attributes_for :images
”在产品模型中,因此我可以保存来自同一产品表单的图像。问题是图像没有被保存。用户应该能够上传 3 张图片(这是我允许的方式“3.times {@product.images.build}
”)。这是我的产品控制器:
def new
@product = Product.new
3.times {@product.images.build}
end
def create
@product = Product.new(params[:product])
if @product.save
redirect_to :root
else
render :action => 'new'
end
end
我也试过这样定义 product_params 方法:
private
def product_params
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])
end
这是控制台抛出的Request信息:
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"qRyYjG9pSaFxgCtMddDN3fpbsTeIAagLEz+psd+Z+oHa2AVjXpXYcbxta/Egj2TGrmF3FFNCllkY54dig3aN8g==",
"product"=>{"title"=>"Title",
"info"=>"Infor",
"description"=>"Description",
"price"=>"9",
"images_attributes"=>{"0"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d830 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-h6wdta.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][0][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
"1"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d704 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-19t1r3v.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][1][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
"2"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d650 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-fj3w5g.png>,
@original_filename="sticker,
375x360.u1.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][2][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">}}},
"commit"=>"Submit"}
如果我在 @product = Product.new(product_params)
中将方法 product_params
作为参数传递,它会保存标题、描述和价格,但不会保存图片。
你保留了 :images_attributes => []
但它应该是 :images_attributes => [:image]
所以,改变这个:
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])
至:
params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [:image])
在您的 product_params
方法中。
之后应该可以了!
对于图像验证,使用这个:
validates_attachment_presence :image
如果此验证不起作用,请尝试使用这样的自定义验证:
validate :image_present
def image_present
if image_file_name.blank?
errors.add(:image, :image not present")
end
end