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会删除现有附件。
如果用户在更新记录时没有选择其他附件,我们如何保留现有附件?
答案 0 :(得分:2)
accepts_nested_attributes_for :sponsor, reject_if: :all_blank
你遇到的问题是,不幸的是,Paperclip实际上非常“愚蠢”。当谈到接受数据时。
由于许多人将相关数据发送到Paperclip,它基本上会采用它给出的内容并从中构建对象。在您的情况下,这意味着您要发送空白对象,使用Paperclip将现有附件替换为空白附件。
reject_if
的{{1}}开关是对此的修复 - 它允许您指定Rails将拒绝&#34;的任何情况。任何嵌套数据,保留你拥有的文件......
accepts_nested_attributes_for
允许您指定
reject_if
或Proc
指向检查是否应为某个属性哈希构建记录的方法。将散列传递给提供的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可以更好地完成此操作,但目前上述情况应该足够了。
参考文献: