Validate HAML from ActiveRecord: scope/controller/helpers for link_to etc?

Posted by Chris Boyle on Stack Overflow See other posts from Stack Overflow or by Chris Boyle
Published on 2010-05-01T22:06:34Z Indexed on 2010/05/01 22:17 UTC
Read the original article Hit count: 257

I like HAML. So much, in fact, that in my first Rails app, which is the usual blog/CMS thing, I want to render the body of my Page model using HAML. So here is app/views/pages/_body.html.haml:

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

...and it works (yay, recursion). What I'd like to do is validate the HAML in the body when creating or updating a Page. I can almost do that, but I'm stuck on the scope argument to render. I have this in 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

You can see I'm passing record, which is a Page, but even that doesn't have a controller, and in particular doesn't have any helpers like link_to, so as soon as a Page uses any of that it's going to fail to validate even when it would actually render just fine.

So I guess I need a controller as scope for this, but accessing that from here in the model (where the validator is) is a big MVC no-no, and as such I don't think Rails gives me a way to do it. (I mean, I suppose I could stash a controller in some singleton somewhere or something, but... excuse me while I throw up.)

What's the least ugly way to properly validate HAML in an ActiveRecord validator?

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about haml