2016-08-17 4 views
0

Моя файловая структура выглядит следующим образом:Рендер относительную HAML с помощью охранника

Guardfile 

resolution1/menu/page1.haml 

resolution1/menu/some_partial.haml 

resolution2/... 

resolution3/... 

Теперь внутри page1.haml У меня есть строка, которая будет оказывать частичное HAML внутри него (я не использую Rails)

= Haml::Engine.new(File.read("./some_partial.haml")).render 

Он терпит неудачу с:

Error: No such file or directory @ rb_sysopen - ./some_partial.haml 

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

= Haml::Engine.new(File.read("#{__dir__}/some_partial.haml")).render 

или если я чувствую себя отчаянной, даже это (чтобы получить абсолютный путь к файлу)

= Haml::Engine.new(File.read("#{File.expand_path(File.dirname(__FILE__))}/some_partial.haml")).render 

Однако, это не работает, как я хотел к.

File.expand_path(File.dirname(__FILE__)) 

вместо того, чтобы дать мой абсолютный путь к файлу (без учета рабочего каталога), он просто дает мне абсолютный путь к моей рабочей директории.

Я могу, конечно, поместить путь, который будет работать, но я не хочу включать мое целевое разрешение в каждый рендер.

Мой Guardfile

guard :haml, output: '../package/www' do 
    watch(/^.+(\.haml)$/) 
end 

Я использую для Windows, черт моей жизни. Какие-либо предложения? Мне просто нужно получить файл из файла в том же каталоге.

ответ

1

Это связано с тем, как Guard :: Haml обрабатывает шаблоны. It (currently) does this:

content = File.new(file).read 
engine = ::Haml::Engine.new(content, (options[:haml_options] || {})) 

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

Haml имеет :filename option, что позволяет вам передать имя файла Haml. Это позволяет __FILE__ и __dir__ работать правильно, но Guard :: Haml не использует его в данный момент.

Я создал pull request that adds this feature. Если вы хотите попробовать этот код перед его объединением и создать новую версию (при условии, что она будет принята), вы можете использовать ветвь в моем репо. Чтобы сделать это, измените ваш Gemfile на:

gem 'guard-haml', :github => "mattwildig/guard-haml", :branch => 'filename_option' 

(я думаю, что это также стоит отметить, что эта установка не будет автоматически восстановить файл «родительский», если один из шаблонов «ребенок» меняется).

+0

Ты потрясающий. –

Смежные вопросы