Проверить HAML из ActiveRecord: область действия / контроллер / помощники для link_to и т. Д.? - PullRequest
1 голос
/ 02 мая 2010

Мне нравится ХАМЛ . Фактически, настолько, что в моем первом приложении на Rails, которое является обычным блогом / CMS, я хочу визуализировать тело модели моей страницы, используя HAML (очевидно, я не буду делать то же самое для комментариев!). Так вот app/views/pages/_body.html.haml:

.entry-content= Haml::Engine.new(body, :format => :html5).render(self)

... и это работает (уу, рекурсия). То, что я хотел бы сделать, это проверить HAML в теле при создании или обновлении страницы . Я почти могу это сделать, но я застрял в аргументе scope на render. У меня есть это в app/models/page.rb:

validates_each :body do |record, attr, value|
    begin
        Haml::Engine.new(value, :format => :html5).render(record)
    rescue Exception => e
        record.errors.add attr, "line #{(e.respond_to? :line) && e.line || 'unknown'}: #{e.message}"
    end
end

Вы можете видеть, что я передаю record, что является Page, но даже у него нет контроллера, и, в частности, нет таких помощников, как link_to, так что, как только Страница использует все, что она не сможет проверить, даже если она будет отображаться очень хорошо.

Так что, мне кажется, мне нужен контроллер , чтобы увидеть его в качестве области действия, но доступ к нему отсюда в модели (где находится валидатор) - это большой MVC-нет-нет, и поэтому я не Я думаю, что Rails дает мне способ сделать это. (Я имею в виду, я полагаю, что я мог бы спрятать контроллер в каком-то синглтоне где-нибудь или что-то, но ... извините меня, когда меня вырвет.)

Какой самый уродливый способ правильно проверить HAML в валидаторе ActiveRecord?

1 Ответ

1 голос
/ 02 мая 2010

После небольшого поиска я нашел ветку в группах Google с идеей, которая помогает мне в этом:

base = ActionView::Base.new('/app/views/pages', {}, PagesController) 
Haml::Engine.new(value, :format => :html5).render(base)

... но, как продолжает поток, некоторые вещи, такие как частичные и дополнительные помощники, не работают.

Вот то, что я в конечном итоге использовал, и, кажется, справляется со всем, что я бросил в него:

contr = PagesController.new()
contr.response = ActionController::Response.new()
scope = ActionView::Base.new(["#{RAILS_ROOT}/app/views/pages","#{RAILS_ROOT}/app/views"], {}, contr)
scope.template_format = 'html'
Haml::Engine.new(value, :format => :html5).render(scope)

( контекст )

...