2014-03-13 47 views
1

我可以使用機械化的形式像這樣成功上傳單個文件:形式上傳多個文件與紅寶石機械化

def add_attachment(form, attachments) 
    attachments.each_with_index do |attachment, i| 
    form.file_uploads.first.file_name = attachment[:path] 
    end 
end 

其中form是機械化的形式。但是如果附件有多個元素,最後一個會覆蓋之前的元素。這顯然是因爲我使用了總是返回file_uploads數組的相同元素的first訪問器。

爲了解決這個問題,我嘗試了這個,這會導致錯誤,因爲這個數組中只有一個元素。

def add_attachment(form, attachments) 
    attachments.each_with_index do |attachment, i| 
    form.file_uploads[i].file_name = attachment[:path] 
    end 
end 

如果我試圖創建一個新的file_upload對象,它也不起作用:

def add_attachment(form, attachments) 
    attachments.each_with_index do |attachment, i| 
    form.file_uploads[i] ||= Mechanize::Form::FileUpload.new(form, attachment[:path]) 
    form.file_uploads[i].file_name = attachment[:path] 
    end 
end 

任何想法,我怎麼能使用機械化上傳多個文件?

回答

2

所以,我解決了這個問題,但並不完全如我所想象的那樣工作。

我試圖上傳文件的網站是一個Redmine項目。 Redmine使用JQueryUI作爲文件上傳器,這讓我困惑,因爲Mechanize不使用Javascipt。但是,事實證明,如果Javascript被禁用,Redmine可以很好地降級,我可以利用這一點。

當Javascript被禁用時,在編輯表單中只能上傳一個文件,但是剛剛創建的問題轉到「編輯」網址就有機會上傳第二個文件。我的解決方案是簡單地附加一個文件,上傳表單,然後單擊結果頁面上的「更新」鏈接,該頁面提供了一個帶有新表單和另一個上傳字段的頁面,然後我可以使用該字段將下一個文件附加到該頁面。我爲所有附件做了這個,但最後一個,這樣表單處理就可以完成,然後上傳最後一次。下面是代碼的初步認識位:

def add_attachment(agent,form, attachments) 
    attachments.each_with_index do |attachment, i| 
    form.file_uploads.first.file_name = attachment[:path] 
    if i < attachments.length - 1 
     submit_form(agent, form) 
     agent.page.links_with(text: 'Update').first.click 
     form = get_form(agent) 
    end 
    end 
    form 
end 
0

我用下面

form.file_uploads [0] .file_name = 「路徑到所述第一文件,該文件被上傳」
form.file_uploads [1 ] .file_name =「要上傳的第二個文件的路徑」
form.file_uploads [2] .file_name =「要上傳的第三個文件的路徑」。

和工作正常。希望這可以幫助。