我创建了一个复制项目的动作,然后允许用户编辑它并将其保存回数据库。
我已经在我的控制器中编写了以下方法,它主要与Paperclip附件不同,后者由于某种原因不会移动。
def duplicate
existing_event = Event.find(params[:id])
@event = Event.new(existing_event.attributes)
render action: 'new'
end
我已经看到this question这个人正在使用.dup
,但我似乎无法在用户在保存之前编辑新项目的情况下工作。< / p>
我也尝试使用像@event.image = existing_event.image
这样的东西,但这也没有任何效果。
这就是我的create方法:
def create
@event = Event.create(event_params)
if @event.save
redirect_to events_path, notice: "Event was successfully created."
else
render action: 'new'
end
end
如果它有任何区别我也会使用S3进行图片上传,如果图像中有多个副本,那对我来说并不重要。
有人可以帮忙吗?谢谢!
答案 0 :(得分:3)
传递附件params就是这样:传递参数。
您需要传递文件本身
下面你会想到如何做到这一点,而不是测试它,但是你可以玩它并使其工作,它应该不那么难。
开启new
行动:
existing_event = Event.find(params[:id])
@event = Event.new(existing_event.attributes)
@event.image = File.open(existing_event.image.path,'rb')
render :action => 'new'
此外:
检查您的create
操作,您有轻微的错误,拨打create
和save
获取相同的记录 - 这是多余的。您应该致电@event=Event.new(event_params)
然后if @event.save
。
答案 1 :(得分:2)
这是我在初始化程序中使用的一小段代码:
module Paperclip
class HasAttachedFile
def define_with_extensions
define_without_extensions
define_dup_override
end
alias_method_chain :define, :extensions
private
def define_dup_override
name = @name
@klass.send :define_method, "dup" do
copy = super()
self.class.attachment_definitions.each do |name, options|
ivar = "@attachment_#{name}"
copy.instance_variable_set(ivar, nil)
copy.send(name).assign send(name)
end
copy
end
end
end
end
这将以编程方式将旧记录中的文件分配给新记录,而不知道实际的附件定义是什么。