我一直忽视这个问题,但我不能再这样了。当product_images
产品的render
视图时,我的嵌套图像模型对象edit
未显示。由于这个原因,当我尝试渲染show
视图时,我的应用程序调用了一个错误,指出图像是nil。
为什么我的嵌套产品图片没有出现?我正在使用paperclip和s3。
我需要嵌套图像表单可编辑,一切都在创建新产品时有效,编辑是唯一的问题。 show动作期间的nil异常与编辑动作故障
有关以下是我的代码:
class ProductImage < ActiveRecord::Base
attr_accessible :product_id, :photo, :image_width, :image_height
belongs_to :product
has_attached_file :photo, :styles => { :small => "150x150>"}, :dependent => :destroy
validates_attachment_presence :photo
validates_attachment_size :photo, :less_than => 5.megabytes
validates_attachment_content_type :photo, :content_type => ['image/jpg', 'image/jpeg', 'image/png', 'image/gif']
after_post_process :save_image_dimensions
def save_image_dimensions
geo = Paperclip::Geometry.from_file(photo.queued_for_write[:original])
self.image_width = geo.width.to_i
self.image_height = geo.height.to_i
end
def sized_different?
if image_width < image_height
true
else
false
end
end
end
class Product < ActiveRecord::Base
attr_accessible :taxable, :shippable, :page_name, :tact_code, :manu_code, :body_code, :name, :alert, :price, :description, :colors_attributes, :sizes_attributes, :extras_attributes, :restraints_attributes, :product_images_attributes
validates_presence_of :page_name
validates_presence_of :price
validates_presence_of :description
validates_presence_of :name
has_many :product_images, :dependent => :destroy
has_many :restraints, :dependent => :destroy
has_many :colors, :dependent => :destroy
has_many :sizes, :dependent => :destroy
has_many :extras, :dependent => :destroy
accepts_nested_attributes_for :colors, :sizes, :extras, :restraints, :product_images
end
def index
@products = Product.search(params)
unless current_cart.nil?
@cart = current_cart
else
@cart = nil
end
end
def new
@product = Product.new
@product.product_images.build
end
def create
@product = Product.new(params[:product])
if @product.save
render :index
else
render :new
end
end
def edit
@product = Product.find(params[:id])
@cart = current_cart
end
def show
@product = Product.find(params[:id])
@cart = current_cart
end
def update
@product = Product.find(params[:id])
if @product.update_attributes!(params[:product])
render :index
else
render :edit
end
end
end
<%= form_for @adminproduct, validate: true, html:{ multipart: true} do |f| %>
<div class="span3 field">
<ul class="unstyled">
<li><%= f.text_field :name, :placeholder => "Product name" %></li>
<li><%= f.text_field :manu_code, :placeholder => "Manufacturer code" %></li>
<li><%= f.text_field :alert, :placeholder => "Alert, example: Save 10%" %></li>
<li><%= f.text_field :price, :placeholder => "Base price" %></li>
<li><%= f.text_area :description, :placeholder => "Product description", :size => "30x10" %></li>
</ul>
</div>
<div class="span6 offset1">
<ul class="unstyled">
<li><%= f.check_box :taxable %>Item can be taxed</li>
<li><%= f.check_box :shippable%>Item can be standard shipped</li>
<li><br /><b>Choose product images:</b></li>
(the first image will be the product's main image)<br/>
<%= f.fields_for :product_images do |p|%><%= render 'product_image_fields', f: p %><% end %>
<li><%= link_to_add_fields "Add image", f, :product_images %></li>
感谢任何见解。
<fieldset>
<%= f.file_field :photo %>
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
答案 0 :(得分:1)
在products_controller上,修改编辑操作以包含product_images,以便accepts_nested_attributes_for知道要更新的图像。
def edit
@product = Product.includes(:product_images).find(params[:id])
# ...
end
答案 1 :(得分:0)
我相信你需要这样称呼你的部分:
<%= render partial: 'product_image_fields', locals: {f: p} %>
如果不起作用,请在原始问题中粘贴'product_image_fields'文件并从控制台输入错误消息
-
好的,这是你的部分
<fieldset>
<%= f.file_field :photo %>
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
您的问题是空的product_image上传输入。那么你使用file_field,它产生input type=file
,HTML将不允许你在这种字段中放置一个值。换句话说:您无法将数据库中的值加载到file_field
。
这是我的建议:
更改部分输出来自数据库的内容。这只是为了验证并确认数据到达正确的地方
<fieldset>
<%= f.object.send :photo %>
<%= f.file_field :photo %>
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
您应该在屏幕上看到图片的路径。另请查看HTML源代码,Rails应添加带有图像记录ID的隐藏字段。
如果你没事,那么你需要使用file_field
之外的其他内容显示图像,尝试使用image_tag或其他任何你想要使用的内容
答案 2 :(得分:0)
您是否尝试过使用Rails提供的精彩accepts_nested_attributes_for
处理嵌套属性?
了解更多http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
修改强> 我认为最好给你一个例子。
class Product < ActiveRecord::Base
attr_accessible ..., :product_images_attributes # <======= Pay attention here. Mass Assignment attributes required
accepts_nested_attributes_for :product_images
....
end