从ActiveRecord验证HAML:link_to等的范围/控制器/帮助器?

时间:2010-05-01 22:06:35

标签: ruby-on-rails validation activerecord scope haml

我喜欢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的最不方便的方法是什么?

1 个答案:

答案 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