2011-01-27 79 views
0

我們需要驗證下載鏈接的工作。由於這些文件相當大,我們需要驗證我們沒有過時的,無用的文件在我們的下載目錄中。因此,我們有一個下載管理頁面,用於驗證每個數據庫file_name在下載目錄中都有一個相同的文件。該頁面然後驗證我們的目錄中的每個文件在我們的數據庫中都有一個file_name。困難與「包括?」聲明

控制器

@documents = Document.find(:all, :order => "section asc, sub_section asc, position asc, name asc") 
@files = Dir.glob("public/downloads/*").sort 

第一個驗證:在我看來,以驗證沒有對數據庫中的每個文檔的記錄文件:

<% @documents.each do |d| -%> 
    <% if @files.include?("public/downloads/" + d.file_name) 
     clr = "Green" 
    else 
     clr = "Red" 
    end %> 

    ... color coded print routine ... 
<% end %> 

的第二次確認:在我看來,以驗證每個文件在數據庫中有文檔記錄:

<% @files.each do |f| -%> 
    <% str = f.gsub(/^.*\//, '') 
    if @documents.include?(str) 
     clr = "Green" 
    else 
     clr = "Red" 
    end %> 

    ... color coded print routine ... 
<% end %> 

用我的sm所有測試文檔列表中,打印的數據庫文件名與從我們的下載目錄打印的文件名完全匹配。但是,第二次驗證的包含測試不起作用。我一直無法弄清楚爲什麼。

謝謝!

回答

2

此代碼:

if @documents.include?(str) 

應該是這樣的:

if @documents.detect{|doc| doc.file_name == str} 
+0

完美工作:=]感謝。 – Jay 2011-01-27 14:44:27

0

代替@documents.include?(str)使用@documents.any? { |d| d.file_name == str}

0

的問題是,@documents不是file_names的集合,它是文檔實例的集合。你應該嘗試這樣的代替:

@documents.map(&:file_name).include?(str) 

這將收集所有file_names,然後檢查是否str匹配他們中的任何一個。