回形针删除更新时现有的附件

阿米特·帕特尔(Amit Patel)

AR模型

class Post < ActiveRecord::Base
  has_one :sponsor
  accepts_nested_attributes_for :sponsor
end

class Sponsor < ActiveRecord::Base
  has_attached_file :logo
  belongs_to :post
end

控制器

def update
  if @post.update(post_params)
    flash[:success] = 'Post update sucessfully'
  else
    flash[:error] = @post.errors.full_messages.join(', ')
    render :edit
  end
end

def post_params
  params.require(:post).permit(:title, :content, sponsor_attributes: [:descriptive_text, :logo, :name, :website, :description])
end

在这里,当Post更新a时,发起人也将以嵌套形式进行更新。

但是在更新过程中,如果用户未选择任何图像,Paperclip会删除现有的附件。

如果用户在更新记录时未选择其他附件,我们如何保留现有附件?

理查德·派克(Richard Peck)
accepts_nested_attributes_for :sponsor, reject_if: :all_blank

reject_if

您遇到的问题是,不幸的是,在接受数据时,回形针实际上是“笨拙的”。

随着许多人将相关数据发送到Paperclip,它基本上会使用给出的数据并从中构建对象。在您的情况下,这意味着您要发送空白对象,导致Paperclip用空白对象替换现有附件。

reject_if用于开关accepts_nested_attributes_for是此修复-它可以让你从那里Rails会“拒绝”任何嵌套的数据指定任何场合,保持你的文件...

reject_if

允许您指定一个ProcSymbol指向一种方法指针,该方法检查是否应为某个属性哈希构建记录。

哈希将传递给提供的Proc或方法,并且它应返回true或false。如果:reject_if指定no ,则将为所有不具有_destroy值且其值为true的属性哈希构建记录。

如果传递:all_blank而不是a,Proc则会创建一个proc,该proc将拒绝一条记录,该记录的所有属性均为空白,不包括的任何值_destroy


需要说明的到,这将是如果你更新的东西其他比图像(我看你有:descriptive_text:logo:name:website:description)。

在这种情况下,您需要将适当的数据传递给Sponsor模型(即无logo参数):

def post_params
   sponsor_params = [:id, :descriptive_text, :logo, :name, :website, :description]
   sponsor_params -= [:logo] if (action_name == "update") && !params[:post][:sponsor_attributes][:logo]

   params.require(:post).permit(:title, :content, sponsor_attributes: sponsor_params)
end

我敢肯定,使用Paperclip验证器有更好的方法,但是就目前而言,就足够了。


参考:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

回形针删除更新时现有的附件

来自分类Dev

Ruby on Rails:在更新时在回形针中删除多个附件

来自分类Dev

链接现有的S3文件作为回形针附件

来自分类Dev

Rails:将现有的回形针附件转换为Image类

来自分类Dev

更新现有的JSON

来自分类Dev

如何绘制现有的opengl颜色附件?

来自分类Dev

删除所有现有的断点

来自分类Dev

使用附件更新现有活动

来自分类Dev

如何更新现有的.plist?

来自分类Dev

更新现有的列数据MySQL

来自分类Dev

如何更新现有的Office插件?

来自分类Dev

可以更新现有的照片标签

来自分类Dev

更新现有的列数据MySQL

来自分类Dev

Django现有的Cookie未更新

来自分类Dev

更新现有的 Yaml 文件

来自分类Dev

删除/更新记录时以可视方式复制现有记录

来自分类Dev

回形针,before_save和删除附件

来自分类Dev

在Silverstripe中扩展对象时,如何修改或删除现有的summary_fields?

来自分类Dev

当我尝试删除现有的Dock时Docky 2.1.2崩溃

来自分类Dev

使用jQuery删除现有的div并在加载时追加到新的div

来自分类Dev

更新堆栈时使用现有的DBUser和DBPassword参数值

来自分类Dev

当模式更新时,Doctrine 添加现有的外键 (mysql)

来自分类Dev

从现有的Docker容器中删除端口绑定

来自分类Dev

如何从ClaimsPrinciple中删除现有的索赔?

来自分类Dev

添加和删除图形中现有的边(BOOST)?

来自分类Dev

如何从现有的请求请求中删除提交?

来自分类Dev

'npm install --only=dev' 删除现有的包

来自分类Dev

解析现有的 CSV 文件并删除某些列

来自分类Dev

如何避免删除现有的托管策略?