4

我正在創建一個複製項目的操作,然後允許用戶對其進行編輯並將其保存回數據庫。使用回形針附件複製記錄

我已經在我的控制器中編寫了以下方法,它主要工作在回形針附件之外,因爲某些原因它不會移動。

def duplicate 
    existing_event = Event.find(params[:id]) 
    @event = Event.new(existing_event.attributes) 

    render action: 'new' 
end 

我見過this question如該人使用.dup,但我似乎無法獲取在用戶保存前編輯新項目的情況下工作。

我也嘗試過使用類似@event.image = existing_event.image的東西,但那也沒有任何效果。

這是我創造的方法是這樣的:

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

爲什麼不是'@event = Event.find(params [:id]);渲染'new''這應該使用所有數據呈現'new.html.erb',然後在保存時創建一個新記錄。鑑於你沒有驗證唯一性,因爲你試圖複製,似乎是必要的。 – engineersmnky

回答

3

傳遞附件params就是這樣做的:通過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

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 

這將從舊記錄新記錄給文件編程不知道實際的附件的定義是什麼。

+0

我發現這非常有用 – hananamar