Rails以编程方式检测文件的更改

时间:2011-08-02 15:08:18

标签: ruby-on-rails ruby html5 offline-mode

我想编写一个方法,以编程方式检测我的rails应用程序中的任何文件是否已更改。有可能做一些类似于整个应用程序的MD5并将其存储在会话变量中吗?

这主要是为了获得一些有趣的缓存清单。我已经有一个动态生成的缓存,它在生产中运行良好。但是在我的开发环境中,每当我更改app目录中的任何内容时,我都希望更新该缓存的id(而不是每10秒,这就是我现在设置它的方式)。

更新

File.ctime(“。”)将是完美的,除了“。”更深的目录文件发生更改时,未标记为已更改。

迭代“。”中的所有目录是否有意义。并将每个的ctimes加在一起?

3 个答案:

答案 0 :(得分:3)

您是否考虑过使用Guard

只要项目中的文件发生变化,您就可以以编程方式执行任何操作。

有关it

的精彩轨道广播

答案 1 :(得分:2)

有一个名为filewatcher的简单ruby gem。这是最先进的例子:

require 'filewatcher'

FileWatcher.new(["README.rdoc"]).watch() do |filename, event|
  if(event == :changed)
    puts "File updated: " + filename
  end
  if(event == :delete)
    puts "File deleted: " + filename
  end
  if(event == :new)
    puts "New file: " + filename
  end
end

答案 2 :(得分:0)

File.ctime是关键。迭代所有文件并根据所有ctimes的总和创建一个唯一的id:

cache_id = 0
Dir.glob('./**/*') do |this_file|
   ignore_files = ['.', '..', "log"]
   ignore_files.each do |ig|
       next if this_file == ig
   end
   cache_id += File.ctime(this_file).to_i if File.directory?(this_file)
end

就像魅力,页面只在需要时重新缓存,即使在开发中也是如此。