2011-01-27 5 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 VALIDATION :

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

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

SECOND VALIDATION : 내보기에서 데이터베이스에있는 모든 문서 레코드에 대한 파일이 있음을 확인하는 내보기에 모든 파일에 날짜 기반의 문서 레코드가 있는지 확인합니다.

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

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

with my sm 모든 테스트 문서 목록에서 인쇄 된 데이터베이스 file_names는 다운로드 디렉토리에서 인쇄 된 파일 이름과 정확히 일치합니다. 그러나 두 번째 유효성 검사에 대한 포함 테스트가 작동하지 않습니다. 나는 이유를 알아낼 수 없었다.

감사합니다.

답변

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이 그와 일치하는지 확인합니다.