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

时间:2015-10-21 07:19:28

标签: ruby-on-rails file-upload paperclip

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时,赞助商也会以嵌套形式更新。

但是在更新时如果用户没有选择任何图像,Paperclip会删除现有附件。

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

1 个答案:

答案 0 :(得分:2)

accepts_nested_attributes_for :sponsor, reject_if: :all_blank

reject_if

你遇到的问题是,不幸的是,Paperclip实际上非常“愚蠢”。当谈到接受数据时。

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

reject_if的{​​{1}}开关是对此的修复 - 它允许您指定Rails将拒绝&#34;的任何情况。任何嵌套数据,保留你拥有的文件......

  

accepts_nested_attributes_for

     

允许您指定reject_ifProc指向检查是否应为某个属性哈希构建记录的方法。

     

将散列传递给提供的Proc或方法,它应该返回true或false。如果未指定Symbol,则将为没有_destroy值且值为true的所有属性哈希构建记录。

     

传递:reject_if代替:all_blank将创建一个proc,该proc将拒绝所有属性为空的记录,不包括Proc的任何值。

如果你正在更新其他而不是图像(我看到你有_destroy:descriptive_text:logo,{{ 1}},:name)。

在这种情况下,您需要将相应的数据传递到:website模型(IE no :description param):

Sponsor

我确信使用Paperclip validators可以更好地完成此操作,但目前上述情况应该足够了。

参考文献: