回形针输入和编辑操作中上传图像的预览
我正在使用paperclip和rails 4,并且多个图像上传工作正常。 但是,我想将其配置为允许上传最多3张图片,并仅显示上传图片的输入和预览。
如果我从3个可能的图像上传图像..然后转到编辑动作..它仍然显示3个上传输入元素而不是2.并且所有人都说“没有选择文件”这对用户不利。 用户可能会在认为他们正在添加新图像时替换该图像。
如何修改我的编辑操作或我的表单,以便对于已填充的资源 , choose file
输入实际上显示上传的文件名而不是在先前已上载图像时No file chosen
的No 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致敬,他在努力寻找解决方案方面付出了相当大的努力。