Чтение файла в шаблоне Rails - PullRequest
       23

Чтение файла в шаблоне Rails

3 голосов
/ 11 января 2010

Я делаю файл шаблона Rails, как показано ниже:

У меня есть большой файл, который я хочу создать, поэтому вместо этого:

file "bigfile.txt", <<-EOF
  content of the file...
EOF

Я хочу прочитать содержимое из другого файла. Теперь у меня есть:

file "public/stylesheets/sass/960.sass", File.read(File.expand_path(File.join(File.dirname(__FILE__), "960.sass")))

Файл находится в том же каталоге, что и файл шаблона rails. Проблема в том, что когда я пытаюсь создать приложение rails с шаблоном (например, rails new_app -m rails_template/rails_template.rb, я получаю следующую ошибку:

The template [rails_template/rails_template.rb] could not be loaded. Error: (eval):129:in `read': No such file or directory - /Users/myusername/Desktop/new_app/960.sass

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

Есть ли способ загрузить файл в шаблон rails?

1 Ответ

3 голосов
/ 11 января 2010

Нет проблем при чтении файла из шаблона. Если бы вы жестко закодировали путь к исходной копии 960.sass, тогда он бы работал нормально.

Как вы подозреваете, проблема заключается в использовании __FILE__. Причина в том, что если вы посмотрите в rails-2.3.4 \ lib \ rails_generator \ generators \ application \ app \ template_runner.rb , вы увидите, что load_template загружает шаблон в строку и затем выполняет его используя instance_eval:

def load_template(template)
  begin
    code = open(template).read
    in_root { self.instance_eval(code) }
  rescue LoadError, Errno::ENOENT => e
    raise "The template [#{template}] could not be loaded. Error: #{e}"
    end
end

Следовательно, когда ваш код выполняется, контекст является блоком eval, и __FILE__ не будет указывать на ваш файл.

Хорошей новостью является то, что параметр template, переданный в load_template (содержащий путь к вашему шаблону), является локальной переменной в точке, когда вызывается instance_eval, и поэтому доступен из кода внутри вашего шаблона. Если вместо этого вы просто делаете:

File.dirname(template)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...