难以理解“包含?”声明

时间:2011-01-27 14:20:02

标签: ruby-on-rails ruby

我们需要验证下载链接是否有效。由于文件非常大,我们需要验证我们的下载目录中没有过时的无用文件。因此,我们有一个下载管理页面,用于验证每个数据库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 %>

使用我的小测试文档列表,打印的数据库file_names与从我们的下载目录打印的文件名完全匹配。但是,第二次验证的包含测试不起作用。我无法弄清楚原因。

谢谢!

3 个答案:

答案 0 :(得分:2)

此代码:

if @documents.include?(str)

应如下所示:

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

答案 1 :(得分:0)

而不是@documents.include?(str)使用@documents.any? { |d| d.file_name == str}

答案 2 :(得分:0)

问题是@documents不是file_names的集合,它是Document实例的集合。你应该尝试这样的事情:

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

这将收集所有file_names,然后检查str是否匹配其中任何一个。