我的Rails 4应用中有两个相关模型:product.rb
和image.rb
。 Image模型允许使用Paperclip gem附加文件。
图片belong_to
产品和产品has_many
图片。
我想在创建产品时使用产品的new
视图来创建和附加图像。每次尝试时,与Paperclip图像关联的参数都不会保存,最终会nil
。
以下是模型:
Product.rb
class Product < ActiveRecord::Base
validates :name, :part_number, presence: true
has_many :images, dependent: :destroy
belongs_to :category
accepts_nested_attributes_for :images, allow_destroy: true
end
Image.rb
class Image < ActiveRecord::Base
belongs_to :product
has_attached_file :image
end
回顾过去的Stack Overflow问题,我发现了一些相关的问题和答案,但似乎没有一个能帮到我的特殊情况。到目前为止,我能够使用正确的属性提交文件,但它不会将它们保存到数据库中。
ProductsController#create
def create
@product = Product.new(product_params)
end
def product_params
params.require(:product).permit(:name,
:category_id,
:part_number,
images_attributes: [:image])
end
ProductsController#new
def new
@product = Product.new
@categories = # irrelevant to question
end
products/new.html.haml
= form_for @product, :html =>
= f.label :name
= f.text_field :name
= f.label :part_number
= f.text_field :part_number
= f.label :category_id
= f.select :category_id, @ca
= f.fields_for :image do |ff|
= ff.label :image
= ff.file_field :image
= f.submit('Create Product')
查看参数我可以告诉正确的属性被传递:
示例参数:
{"utf8"=>"✓",
"authenticity_token"=>"jGNy/TasHzP0EcWDFzZ3XH5/fpxb6vD+ncQ2PZSQ3/I=",
"product"=>{"name"=>"bar",
"part_number"=>"foo",
"category_id"=>"30",
"image"=>{
"image"=>#<ActionDispatch::Http::UploadedFile:0x007fc82f58e0e0
@tempfile=#<Tempfile:/var/folders/04/23d9grkj5fv3wkj2t8858kx40000gn/T/RackMultipart20131029-64949-1ldkz4g>,
@original_filename="FPE230_b.jpg",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"product[image][image]\"; filename=\"FPE230_b.jpg\"\r\nContent-Type: image/jpeg\r\n">}},
"commit"=>"Create Product"}
但是,图像实际上并未保存到数据库中。我怎么能纠正这个?
修改
仔细查看日志,我发现我收到了“未经许可的参数:图像”错误。将images_attributes: [:image]
添加到product_params
方法后,即使这样做了。
答案 0 :(得分:3)
我能够获得与您的设置类似的设置,并进行以下更改:
在ProductsController#create
中,不是单独构建图像,而是让嵌套属性处理它,然后执行:
@product = Product.new(product_params)
并允许嵌套参数(我从this question计算出image_attributes: [:image]
):
def product_params
params.require(:product).permit(:name, :part_number, images_attributes: [:image])
end
这是我的参数在create
请求的日志中的样子:
{
"utf8"=>"✓",
"authenticity_token"=>"7EsPTNXu127itgp4fbohu672/L4XnSwLEkrqUGec3pY=",
"product"=>{
"name"=>"whatever",
"part_number"=>"12345",
"images_attributes"=>{
"0"=>{
"image"=>#<ActionDispatch::Http::UploadedFile:0x007feb0c183b08
@tempfile=#<Tempfile:/var/folders/6k/16k80dds0ddd6mhvs5zryh3r0000gn/T/RackMultipart20131031-51205-emaijs>,
@original_filename="some-image.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"product[images_attributes][0][image]\"; filename=\"ponysay.png\"\r\nContent-Type: image/png\r\n">
}
}
},
"commit"=>"Create"}
我看到插入products
并插入images
。
如果这不起作用,您可以发布ProductsController#new
和您的新产品表单吗?
编辑后编辑:
我的app/views/products/new.html.erb
和ProductsController#new
中有3个不同的内容可能会影响您的搜索结果:
在form_for
中,我multipart: true
中有<%= form_for @product, :url => products_path, :html => { :multipart => true } do |f| %>
:
Product
由于has_many :images
fields_for :images
,我的格式为fields_for :image
而不是<%= f.fields_for :images do |i| %>
<%= i.file_field :image %>
<% end %>
:
fields_for
此ProductsController#new
在页面上没有显示任何内容,除非Product.new
我构建了一个图片;您的def new
@product = Product.new
@product.images.build
end
是否有机会这样做?
{{1}}
你有这些差异有什么特别的原因吗?如果你改变它以匹配我的代码,你的代码是否有效?