回形针输入和编辑操作中上传图像的预览

我正在使用paperclip和rails 4,并且多个图像上传工作正常。 但是,我想将其配置为允许上传最多3张图片,并仅显示上传图片的输入和预览。

如果我从3个可能的图像上传图像..然后转到编辑动作..它仍然显示3个上传输入元素而不是2.并且所有人都说“没有选择文件”这对用户不利。 用户可能会在认为他们正在添加新图像时替换该图像。

如何修改我的编辑操作或我的表单,以便对于已填充的资源choose file输入实际上显示上传的文件名而不是在先前已上载图像时No file chosenNo file chosen或根本不显示输入元素?

我的表单字段:

    

Images

Delete:

我的控制器动作:

  def new @post = Post.new 3.times { @post.assets.build } ... end end def edit @post = Post.find(params[:id]) if @post.assets.count < 3 3.times { @post.assets.build } end end 

模型:

 class Asset  { :medium => "600x600>", :small => "200x200>", :thumb => "100x100>" }, :default_url => "no_image_fr_:style.png" validates_attachment_content_type :attachment, :content_type => %w(image/jpeg image/jpg image/png) end 

资产表的属性

 class Asset  :integer, :post_id => :integer, :created_at => :datetime, :updated_at => :datetime, :attachment_file_name => :string, :attachment_content_type => :string, :attachment_file_size => :integer, :attachment_updated_at => :datetime } 

在此处输入图像描述

编辑

所以看起来(3 - @assets.count).times { @assets.build }确实构建了正确数量的资产,但它仍然显示3个输入元素,无论如何。

是什么原因导致

   "Image:", wrapper: :horizontal_file_input %>  

即使assets.count = 1 ??总是显示3个输入

拒绝未使用的file_fields

 # model has_attached_file :attachment, :styles => { :medium => "600x600>", :small => "200x200>", :thumb => "100x100>" }, :default_url => "no_image_fr_:style.png", :reject_if => lambda { |t| t['attachment'].nil? } 

更新您的edit操作,以便仅显示剩余的文件字段数

 # controller def edit @post = Post.find(params[:id]) @assets = @post.assets (3 - @assets.count).times { @assets.build } end 

显示已上传的图像和所需的file_fields

 <%= f.fields_for :assets do |builder| %> <%= builder.file_field :attachment %> <% end %> 

Images

<% @assets.each do |a| %> <%= link_to image_tag(a.attachment.url(:thumb)), a.attachment.url(:original) %> Delete: <%= check_box_tag :_destroy %> <% end %>

清理资产表后测试它。

您可能只尝试为尚未创建的图像数量构建新资源。 您的编辑操作如下所示:

 def edit @post = Post.find(params[:id]) (3 - @post.assets.count).times do @post.assets.build end end 

你也要记住,如果你在Post模型中使用accepts_nested_attributes_for ,你可能需要添加update_only: true

希望有所帮助! 🙂

我终于想出了一个很好的方法来做到这一点

要仅显示剩余的字段字段,我必须检查它是否仍然是新记录…即使assets.count是正确的,显示的字段数也是不正确的。 此validation有帮助。

  <% if builder.object.new_record? %> 

为了只显示“已填充”资产,我必须检查它是否不是新记录!

 <% @post.assets.each do |ast| %> <% if !ast.new_record? %> <%=link_to image_tag(ast.attachment.url(:thumb)), ast.attachment.url(:medium), :popup=>['original_image', 'height=700,width=900'] %> <%= check_box_tag :_destroy %> delete  <%end%> <% end %> 

现在在编辑操作中它只显示剩余的字段…当资产已经填充时,它会显示一个带有删除复选框的预览!

仍然好奇为什么文件字段总是显示3,即使post.assets.count是正确的。

我正在向Raj致敬,他在努力寻找解决方案方面付出了相当大的努力。