我喜欢HAML。事实上,在我的第一个Rails应用程序中,这是通常的博客/ CMS事情,我想使用HAML渲染我的Page模型的主体(显然我不会对Comment做同样的事情!)。所以这是app/views/pages/_body.html.haml
:
.entry-content= Haml::Engine.new(body, :format => :html5).render(self)
......它有效(yay,递归)。我想做的是在创建或更新页面时验证正文中的HAML 。我几乎可以这样做,但我坚持scope
的{{1}}参数。我在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
这样的助手因此,只要一个页面使用其中任何一个,即使它实际上渲染得很好,它也将无法验证。
所以我想我需要一个 controller 视图作为其范围,但是从模型(验证器所在的位置)这里访问它是一个很大的MVC禁忌,因此我不喜欢我认为Rails让我有办法做到这一点。 (我的意思是,我想我可以把某个控制器存放在某个地方或某个地方,但是......请原谅我。)
在ActiveRecord验证器中正确验证HAML的最不方便的方法是什么?
答案 0 :(得分:1)
通过更多搜索,我发现a thread on Google Groups有一个想法可以达到我的目的:
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)
(context)