как сохранить имя вложенных файлов в переменной и перебрать их в граблях - PullRequest
1 голос
/ 02 июля 2010

У меня есть следующий файл rake для создания статической версии моего приложения sinatra, украдено у http://github.com/semanticart/stuff-site/blob/master/Rakefile

class View
  attr_reader :permalink
  def initialize(path)
    filename = File.basename(path)
    @permalink = filename[0..-6]
  end
end

view_paths = Dir.glob(File.join(File.dirname(__FILE__), 'views/pages', '*.haml'))
ALL_VIEWS = view_paths.map {|path| View.new(path) }

task :build do
  def dump_request_to_file url, file
    Dir.mkdir(File.dirname(file)) unless File.directory?(File.dirname(file))
    File.open(file, 'w'){|f| f.print @request.get(url).body}
  end

  static_dir = File.join(File.dirname(__FILE__), 'public')

  require 'sinatra'
  require 'c4eo'
  @request = Rack::MockRequest.new(Sinatra::Application)

  ALL_VIEWS.each do |view|
    puts view
    dump_request_to_file("/#{view.permalink}", File.join(static_dir, view.permalink+'.html'))
  end
end

ALL_VIEWS теперь является массивом, содержащим все файлы Haml в корне моего каталога 'views / pages'.

Как мне изменить ALL_VIEWS и метод dump_request_to_file для циклического перебора всех подкаталогов в моем каталоге views / pages?

Каталог моих просмотров выглядит примерно так: http://i45.tinypic.com/167unpw.gif

Если это сделает жизнь намного проще, я мог бы хранить все мои файлы с именем index.haml внутри каталогов.

Спасибо

1 Ответ

2 голосов
/ 02 июля 2010

Чтобы просмотреть все подкаталоги, измените «views / pages» на «views / pages / **»

Двойные знаки указывают на рекурсивный поиск, вы можете увидеть это в документации на http://ruby -doc.org / ядро ​​/ классов / Dir.html # M002322


Обратите внимание, что я не очень внимательно изучил ваш вариант использования, но предварительно кажется, что у вас могут возникнуть проблемы при создании постоянной ссылки. Когда я проверил результаты, я получил:

[#<View:0x1010440a0 @permalink="hound">,
 #<View:0x101044078 @permalink="index">,
 #<View:0x101044000 @permalink="hound">,
 #<View:0x101043f88 @permalink="index">,
 #<View:0x101043f10 @permalink="references">,
 #<View:0x101043e98 @permalink="do_find">,
 #<View:0x101043e20 @permalink="index">,
 #<View:0x101043da8 @permalink="README">]

которые были сгенерированы из этих файлов:

["/Users/josh/deleteme/fileutilstest/views/pages/bar/cheese/rodeo/hound.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/bar/cheese/rodeo/outrageous/index.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/hound.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/index.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/references.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/do_find.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/tutorials/index.haml",
 "/Users/josh/deleteme/fileutilstest/views/pages/tutorials/README.haml"]

И похоже, что вы создаете ссылку с: File.join (static_dir, view.permalink + '. Html')

Итак, вы можете видеть, что в этом случае это создаст три файла, например static_dir/index.html

Довольно очевидным решением является включение относительной части ссылки, чтобы она стала

static_dir/bar/cheese/rodeo/outrageous/index.html
static_dir/bar/pizza/index.html
static_dir/tutorials/index.html

РЕДАКТИРОВАТЬ : Что касается определения того, как найти относительный URL, это похоже на работу

class View
  attr_reader :permalink
  def initialize( root_path , path )
    root_path = File.expand_path(root_path).sub(/\/?$/,'/')
    path      = File.expand_path path
    filename  = path.gsub root_path , String.new
    raise "#{path} does not appear to be a subdir of #{root_path}" unless root_path + filename == path
    @permalink = filename[0..-6]
  end
end


view_paths = Dir.glob(File.join(File.dirname(__FILE__), 'views/pages/**', '*.haml'))
ALL_VIEWS = view_paths.map { |path| View.new 'views/pages' , path }

require 'pp'
pp ALL_VIEWS

Я не очень заинтересован в [0 ..- 6], он работает только в том случае, если вы знаете, что ваш файл имеет суффикс и его длина составляет пять символов. Но я собираюсь оставить это в покое, так как я не знаю, как бы вы хотели обрабатывать различные будущие ситуации, которые я мог бы предвидеть (т.е. сгенерировать html из haml и обработать его, теперь у вас есть два файла index.html и index.haml, которые после удаления их расширений являются просто индексами, или styles.css, который теряет часть своего имени файла, когда вы пытаетесь удалить его расширение, вытягивая [0 ..- 6]

...