But render_to_string is only available in controller action pack, is
there a easy way to render_to_string in a Model? Or is there a way to
call a controller action from script/runner?
Unfortunately yes. Write this:
class BigController...
def action
yo = Model.new
yo.do_mail(self)
...
class Model
def do_mail(context)
... context.render_to_string :action => ...
end
Now consider refactoring that differently, before the MVC Police get on your tail. Maybe it should go like this:
class BigController...
def action
yo = Model.new
yo.do_mail() do |whatever|
render_to_string ...
end
I haven't found a way to abuse blocks in Ruby yet, but I'm sure it's theoretically possible...
class BigController...
def action
yo = Model.new
yo.do_mail() do |whatever|
render_to_string ...
end
Thanks for the posting, this is sort of what I am looking for, however
when I try a simple example as above I get the error
"NoMethodError: protected method `render_to_string' called for"
Try passing the outer context into the inner block:
that = self
yo.do_mail() do |whatever|
that.render_to_string ...
end
That avoids continuation magic.
Phlip, so I got confused if I fire up script/runner how would I call the
model method correctly to trigger the render_to_string?
I only know how to create a Controller context in two situations - a real web server, or a mocked unit test.
If all you need is a string, the following hack will do until someone points out the third alternative. Write a unit test that does what you need - as production code - and then call it on command. You shouldn't even need the scripts; just say ruby my_hacks/my_fake_test.rb
That's all because test_helper.rb pulls in exactly the right context to test with, so it can mock Controllers. So you can use one as a mock-mock, to support production code!
But, like all hacks, there's probably a brilliant solution I have overlooked. You could, for example, generate your HTML with Builder::XmlMarkup, instead of render_to_string...