Использование методов rails с Haml :: Engine - PullRequest
3 голосов
/ 01 июля 2011

Я хочу получить задачу rake, которая читает файл HAML и создает из него статический файл html. Причина этого заключается в том, что я хочу динамически локализовать свои страницы ошибок способом, описанным здесь http://devcorner.mynewsdesk.com/2010/01/13/rails-i18n-and-404500-error-pages/

Вот способ записи страниц с ошибками.

def write_error_page(status, locale = nil)
  dest_filename = [status.to_s, locale, "html"].compact.join(".")
  File.open(File.join(Rails.root, "public", dest_filename), "w") do |file|
    path = File.join(Rails.root, "app", "views", "errors", "#{status}.haml")
    file.print Haml::Engine.new(File.read(path)).render
  end   
end

Проблема в том, что Haml :: Engine не имеет доступных методов rails. Поэтому, когда я пытаюсь прочитать файл haml, я получаю сообщение об ошибке для каждого метода rails в файле (я хочу использовать методы как image_tag, form_for и, очевидно, I18n.translate).

Я заметил похожую проблему, которая была решена здесь: Рендеринг движка HAML на Rails

Однако, когда я пробую решение, упомянутое в ссылке выше, я получаю следующую ошибку: «неопределенная локальная переменная или метод« config »для #».

Как я мог заставить методы rails работать в Haml :: Engine, чтобы я мог читать файл HAML? Я также попытался переключиться на ERB, но заметил, что это приводит к той же проблеме, которую кто-то еще хотя бы частично разрешил здесь рендеринг erb из базы данных в проблему, пожалуйста, помогите! Но это решение не помогло мне либо.

Я также открыт для других решений, кроме использования Haml :: Engine. Я посмотрел на помощника capture_haml, но тоже не понимаю, как это мне поможет.

Ответы [ 3 ]

0 голосов
/ 04 июля 2011

Я только сейчас понял, что мне не нужен Haml :: Engine в этой ситуации, потому что я нахожусь в среде rails, поэтому я могу просто вызвать render.Глупый я.

Однако вызывать рендер из задачи с граблями не совсем тривиально, потому что мы не находимся в контроллере или представлении (и поэтому пуристы рельсов даже говорят, что вы никогда не должны этого делать, я думаю,но в данном случае это кажется самым простым способом), поэтому я выкладываю код, который использовал здесь (я использовал упомянутый здесь подход: http://wholemeal.co.nz/blog/2011/04/05/rendering-from-a-model-in-rails-3/).

def write_error_page(status, locale = nil)
  dest_filename = [status.to_s, locale, "html"].compact.join(".")
  File.open(File.join(Rails.root, "public", dest_filename), "w") do |file|
    path = File.join("app", "views", "errors", "#{status}.haml")
    file.print ActionView::Base.new(Rails.configuration.paths.app.views.first).render(:file => path)
  end   
end

У меня были некоторые проблемы с этим подходомтоже. Например, form_for по-прежнему не работал должным образом (я хочу, чтобы на странице ошибок была форма обратной связи), поэтому я просто создал форму с простым HTML (который вы можете, к счастью, вставить прямо в файлы .haml).вещь из рельсов, которую мне нужно было заставить работать в шаблоне .haml - метод I18n.translate - работает как шарм.

0 голосов
/ 07 мая 2013

Я сделал это решение на основе вашего, когда вы не работали для меня, из-за пути просмотра и потому, что мне нужно было включить некоторые функции из моего помощника приложения. Я думаю, что вы можете решить проблему form_for, включая это: ActionView::Base.send :include, ActionView::Helpers::FormHelper

Я изменил формат на html, потому что это было то, что мне было нужно ...

def to_html
  ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper

  File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file|

  file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
                :partial => 'partial_folder/partial', 
                :format => :html,
                :locals => { :model => self}
              )
  end  
end
0 голосов
/ 02 июля 2011

Вам нужно сделать :environment зависимым от вашего рейка:

task :some_task => :environment do
  # stuff here
end

Это загрузит Rails. Похоже, он не был загружен.

...