2013-06-02 89 views
1

試圖在不破壞現有數據保存結構的情況下實現此目的。我有一個表單,上傳單個圖像資產編輯修改了5張圖片資產的表格。 見下文。 。 。回形針多圖像上傳

下面的表格上寫着:

<%= form_for @asset, :html => { :multipart => true } do |f| %> 
<div class="span10"> 
    <%= render 'shared/asset_errors' %> 
    <h3>Upload to Procedure Folder</h3> 
</div> 
<div class="span5"> 
    <% @procedures = @patient.procedure_folders.all %> 
    <%= f.label :procedure_folder_id, "Procedure" %> 
    <%= f.select :procedure_folder_id, @procedures.map { |p| 
    [Procedure.find(p.procedure_id).procedure, p.id] } %> 
    </div> 
    <div class="span5"> 
    <%= f.label :date %> 
    <%= f.text_field :date, 'data-behaviour' => 'datepicker' %> 
    </div> 
    <div class="span10"> 
    <%= f.label :notes %> 
    <%= f.text_field :notes %> 
    </div> 
    <div class="span10"> 
    <% 5.times do |image| %> 
    <p><%= f.file_field :asset, name: "asset[asset][#{image}]", 
    id: "asset_asset_#{image}" %></p> 
    <% end %> 
    </div> 
    <div class="span10"> 
    <%= f.hidden_field :patient_id, value: @patient.id %> 
    <%= f.submit "Upload", class: "btn btn-primary" %> 
    </div> 
    <% end %> 

我想什麼來實現 - 通過一些列的方法已經閱讀 - 就是以這種形式靜態地方5表單字段..或使它與jQuery的「添加另一張照片」按鈕準備好。

類和控制器

類第一:

class Asset < ActiveRecord::Base 
    attr_accessible :asset, :asset_content_type, :asset_file_name, :asset_file_size, :asset_updated_at, :patient_id, :procedure_folder_id, :date, :notes 
    belongs_to :procedure_folder 
    belongs_to :patient 

    has_attached_file :asset, :styles => { :large => "800x600", 
                      :thumb => "150x150" } 

    validates :date, presence: true 
    validates :patient_id, presence: true 
    validates :asset, :attachment_presence => true 

    default_scope order: 'assets.date ASC' 
end 

控制器:

class AssetsController < ApplicationController 
    before_filter :signed_in_user 

    def create 
     @asset = Asset.new(params[:asset]) 
     if @asset.save 
      flash[:success] = "Images uploaded successfully!" 
      redirect_to patient_path(@asset.patient_id) 
     else 
      flash[:error] = "There was an error, Date and Image is required!" 
      redirect_to patient_path(@asset.patient_id) 
     end 
    end 

    def destroy 
     @asset = Asset.find(params[:id]) 
     set_variables 
     if !current_user.admin? 
      flash[:error] = "You do not have delete priviledges" 
      redirect_to procedure_folder_path(@asset.procedure_folder_id) 
     else 
      @asset.destroy 
      flash[:info] = "Image has been deleted and cannot be recovered" 
      redirect_to procedure_folder_path(@asset.procedure_folder_id) 
     end 
    end 

    def set_variables 
    end 
end 

我可以採取哪些步驟來有效地保持現有的結構和避免增加在第二形式。這是在一個小型的生產環境中運行,並希望避免與現有數據混淆......(在我們實際使用之前,會自然地在dev上進行測試)。

任何想法/提示/解決方案將不勝感激。

預先感謝您。

編輯

現在的形式出現正確上傳多張圖片時,我收到以下錯誤。

Paperclip::AdapterRegistry::NoHandlerError in AssetsController#create 

No handler found for {"0"=>#<ActionDispatch::Http::UploadedFile:0x007f88c517c230 @original_filename="Screen Shot 2013-02-11 at 11.03.46 PM.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"asset[asset][0]\"; filename=\"Screen Shot 2013-02-11 at 11.03.46 PM.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-jzz7cl>>, "1"=>#<ActionDispatch::Http::UploadedFile:0x007f88c563bb40 @original_filename="Screen Shot 2013-03-18 at 10.59.47 PM.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"asset[asset][1]\"; filename=\"Screen Shot 2013-03-18 at 10.59.47 PM.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-1h5qj85>>, "2"=>#<ActionDispatch::Http::UploadedFile:0x007f88c563da30 @original_filename="Screen Shot 2013-03-18 at 11.01.06 PM.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"asset[asset][2]\"; filename=\"Screen Shot 2013-03-18 at 11.01.06 PM.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-1xsd0fk>>} 

Rails.root: /Users/sandovalg/Documents/rails_projects/autre_dlz 
Application Trace | Framework Trace | Full Trace 

app/controllers/assets_controller.rb:5:in `new' 
app/controllers/assets_controller.rb:5:in `create' 

Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"RjRFHgYu/4fHRl0iksOkivVOR4ikIvavvXxoqSoTMW0=", 
"asset"=>{"procedure_folder_id"=>"1", 
"date"=>"2013-06-04", 
"notes"=>"", 
"asset"=>{"0"=>#<ActionDispatch::Http::UploadedFile:0x007f88c517c230 @original_filename="Screen Shot 2013-02-11 at 11.03.46 PM.png", 
@content_type="image/png", 
@headers="Content-Disposition: form-data; name=\"asset[asset][0]\"; filename=\"Screen Shot 2013-02-11 at 11.03.46 PM.png\"\r\nContent-Type: image/png\r\n", 
@tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-jzz7cl>>, 
"1"=>#<ActionDispatch::Http::UploadedFile:0x007f88c563bb40 @original_filename="Screen Shot 2013-03-18 at 10.59.47 PM.png", 
@content_type="image/png", 
@headers="Content-Disposition: form-data; name=\"asset[asset][1]\"; filename=\"Screen Shot 2013-03-18 at 10.59.47 PM.png\"\r\nContent-Type: image/png\r\n", 
@tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-1h5qj85>>, 
"2"=>#<ActionDispatch::Http::UploadedFile:0x007f88c563da30 @original_filename="Screen Shot 2013-03-18 at 11.01.06 PM.png", 
@content_type="image/png", 
@headers="Content-Disposition: form-data; name=\"asset[asset][2]\"; filename=\"Screen Shot 2013-03-18 at 11.01.06 PM.png\"\r\nContent-Type: image/png\r\n", 
@tempfile=#<File:/var/folders/8k/ctb40yd92w13qyjj3fn0gdnc0000gn/T/RackMultipart20130604-13969-1xsd0fk>>}, 
"patient_id"=>"1"}, 
"commit"=>"Upload"} 
+0

如果我正確地跟着你,你想存儲的圖片列表在你存儲單張照片的領域?最小的變化? – Narfanator

+0

是的,正確的。希望能夠。 。 。利用相同的形式..獲得上傳多張照片的能力。作爲例子** f.file_field:asset **接受_:asset [1],:asset [2],:asset [x] _。這有助於澄清請求嗎?謝謝你的評論。 – sandovalg

+1

呃,還有很多事情要做,一個模特協會,所以病人擁有多少資產?也會有一些小的javascript參與,但看看下面的railscasts http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast和http://railscasts.com/劇集/ 134-paperclip – Richlewis

回答

1

考慮要保存的記錄到同一個數據庫表單,看來你需要使用accepts_nested_attributes_for,這是我通常用回形針使用

保存多個記錄的打折一旦

看來你的主要問題是在一次保存多個記錄:

No handler found for {"0"=> 

這表明Rails無法計算保存函數,因爲它僅針對單個參數設計。您實際上必須用手動的SQL查詢保存記錄,這樣的資源:

本質上講,你莫名其妙地通過您的PARAMS必須循環數組,並以一種批量方式保存數據。這裏是你可以做的一種方式:

按照這些鏈接之一,您可以使用activerecord-import寶石

def create 
assets = [] 
    params[:asset].each do |k,v| 
     assets << Asset.new(params[:asset][k]) 
    end 
    Asset.import assets 
end