render_to_string in a model ?

Glenn Cadman wrote:

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 =         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 =         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...

Glenn Cadman wrote:

  class BigController...      def action         yo =         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...

A much easier solution is described here: