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会删除现有的附件。
如果用户在更新记录时未选择其他附件,我们如何保留现有附件?
accepts_nested_attributes_for :sponsor, reject_if: :all_blank
您遇到的问题是,不幸的是,在接受数据时,回形针实际上是“笨拙的”。
随着许多人将相关数据发送到Paperclip,它基本上会使用给出的数据并从中构建对象。在您的情况下,这意味着您要发送空白对象,导致Paperclip用空白对象替换现有附件。
该reject_if
用于开关accepts_nested_attributes_for
是此修复-它可以让你从那里Rails会“拒绝”任何嵌套的数据指定任何场合,保持你的文件...
reject_if
允许您指定一个
Proc
或Symbol
指向一种方法的指针,该方法检查是否应为某个属性哈希构建记录。哈希将传递给提供的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] 删除。
我来说两句