使用Paperclip附件复制记录

时间:2014-05-05 17:27:59

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 paperclip

我创建了一个复制项目的动作,然后允许用户编辑它并将其保存回数据库。

我已经在我的控制器中编写了以下方法,它主要与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进行图片上传,如果图像中有多个副本,那对我来说并不重要。

有人可以帮忙吗?谢谢!

2 个答案:

答案 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操作,您有轻微的错误,拨打createsave获取相同的记录 - 这是多余的。您应该致电@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

这将以编程方式将旧记录中的文件分配给新记录,而不知道实际的附件定义是什么。