2011-01-27 13 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 

FIRST検証:

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

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

SECOND検証::私の見解では、データベース内のすべての文書レコード用のファイルがあることを検証するために私の見解ではすべてのファイルに日付ベースの文書レコードがあることを確認します。

すべてのテストドキュメントリスト、印刷されたデータベースのfile_namesは、ダウンロードディレクトリから印刷されたファイル名と正確に一致します。ただし、2回目の検証のインクルードテストは機能しません。私は理由を理解することができませんでした。

ありがとうございました!

答えて

2

このコード:

if @documents.include?(str) 

は次のようになります。

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

は完全に働いた:=]のおかげで。 – Jay

+0

私は、これを行う正しい一般的な方法ではないと考えています。検出された要素が返されるため、文字列が空でないことがわかっているので、この場合に動作します。 代わりに.map().include()または.any()を使用する必要があります。 –

+0

実際に検出すると、常にドキュメントインスタンスが返されるため、その可能性はありません。この場合、唯一の違いは何ですか? booleanを返し、detectはDocumentインスタンスまたはnilを返します。 – psyho

0

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

0

問題は@documentsがfile_namesの集まりではないということです、それはドキュメントインスタンスのコレクションです。

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

これにより、すべてのファイル名が収集され、strがそれらのいずれかと一致するかどうかが確認されます。

関連する問題