What happened to ActionView::Base.erb_variable?

Hey,

I’ve just switched over to using Erubis for a little speed improvement, however it falls over on any views that call a helper method.

This change (google cache cus trac is down): http://216.239.59.104/search?q=cache:H0azguk0XjgJ:dev.rubyonrails.org/changeset/5544+erb_variable&hl=en&ct=clnk&cd=1&gl=uk adds support for changing the erb buffer as required by Erubis which expects _buf instead of _erubis. I don’t know what happened to this change but it certainly isn’t in 1.2.2, anyone know what happened?

Cheers ian

It didn't make it the stable branch. If we can get a few real success stories on the use of erubis in Rails, I'll gladly move it to the stable branch for a 1.2.3 release (assuming there will be one, there are no definite plans).

I was working with Ezra on erubis support when I committed that. AFAIK, the erubis rails adapter still needs a few changes to allow it to work with yield, and it should be ready as a drop-in replacement.

Er, I see Jeremy committed that. I think we were just working on this at the same time though :slight_smile:

Thanks. Apart from yield and the _erbout issue, Erubis has worked just fine, no other issues as far as I can tell (I haven’t tested the CachedRailsTemplate handler yet though). Anything you’d like me to look into? I’d like this to make the next release if possible.

Cheers ian

I don’t know what the plans for @content_for_layout are, is it going to be removed at some point? If so then this patch is void. My Ruby isn’t great and my knowledge of Rails internals even less so; this patch may indeed suck. This fixes the problem with using yield with some funky nested block magic. I realise this isn’t the Erubis list, though I’d like to get some input on the future of @content_for_layout before standing this upstream.

Cheers ian

erubis-yield-fix.patch (417 Bytes)

according to http://www.kuwata-lab.com/erubis/CHANGES, erubis 2.2 should work now. Is it only missing erb_variable or is there more that needs to be done to rails?

Erubis also has an outstanding patch on the rails helper that [when applied] solves problems with various assigned variables [cookies, etc]. http://rubyforge.org/tracker/index.php?func=detail&aid=6726&group_id=1320&atid=5203

It bites me in the ass every time. But, fortunately, it’s easy enough to fix. It doesn’t look like it’s been resolved into 2.2.0 though. I might be wrong.

RSL

I can’t get 2.2.0 to work. It looks like it requires a patched action_view/base.rb. It not longer uses the register_template_handler method and instead tries to override the default call to ERB.new, take a look here: http://www.kuwata-lab.com/erubis/users-guide.05.html#topics-rails

rails_helper.rb then as this at the bottom:

set Erubis as eRuby compiler in Ruby on Rails instead of ERB

class ActionView::Base # :nodoc:

private def convert_template_into_ruby_code(template) #src = Erubis::Eruby.new(template).src klass = Erubis::Helpers::RailsHelper.engine_class properties = Erubis::Helpers::RailsHelper.init_properties

show_src   = Erubis::Helpers::RailsHelper.show_src
src = klass.new(template, properties).src
src.insert(0, '_erbout = ')
logger.debug "** Erubis: src==<<'END'\n#{src}END\n" if show_src

src

end end

There may be a good reason for avoiding register_template_handler like this, though on the face of it it doesn’t look very nice. Also notice the src.insert(0, '_erbout = ') line, perhaps it’ll work without the erb_variable change. I’m not willing to patch my ActionView base.rb, so I don’t know if yield works now (there is no mention of it in the ChangeLog).

Russell, that patch seems to be invalidated by 2.2.0, the code in rails_helper.rb has changed a lot and _localvar_code() no longer exists.

Hi Ian, thank you for trying Erubis.

I can't get 2.2.0 to work. It looks like it requires a patched action_view/base.rb.

It is not necessary to apply the patch. It is optional, because this patch is included in 'erubis/helpers/rails_helper.rb'.

I'm not willing to patch my ActionView base.rb, so I don't know if yield works now (there is no mention of it in the ChangeLog).

'yield' will work very well with Erubis 2.2.0. And the following methods which assume that variable name is '_erbout' also works. * ActionView::Helpers::CaptureHelper#capture() * ActionView::Helpers::CaptureHelper#content_for() * ActionView::Helpers::TextHelper#concat()

If you have any troubles about Erubis 2.2.0 with Ruby on Rails, please tell me. Thank you for trying Erubis.

With just: require ‘erubis/helpers/rails_helper’ Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby

in my environment.rb it fails because it expects .rhtml extensions on the views. Don’t we need to use register_template_handler at some point to inform rails to look for the .erubis extension too? I don’t see anything in rails_helper.rb that does similar. Could you also explain the reason for avoiding register_template_handler?

Cheers ian

With just: require 'erubis/helpers/rails_helper' Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby

in my environment.rb it fails because it expects .rhtml extensions on the views.

what errors do you have? I need details of error messages, with Rails version.

Don't we need to use register_template_handler at some point to inform rails to look for the .erubis extension too? I don't see anything in rails_helper.rb that does similar. Could you also explain the reason for avoiding register_template_handler?

reasons:

* Using register_template_handler() is no merits for Erubis in paticular   around performance.   ActionView is optimized for ERB and it creates temporary method for view   from '*.rhtml' file. It works fast because it removes the cost to convert   '*.rhtml' file into ruby code and parse it.   But register_template_handler() reads '*.rhtml' file every time and it is   necessary to convert eRuby into ruby code and pase it every time.   These costs are not small and spoil the merit of Erubis's speed.   You may use Erubis with register_template_handler(), but you will not able   to get the advantage of Erubis's performance.   (In fact, ActionView is designed tightly with ERB, I think. There is no way    to get template file name in register_template_handler(). It is unconvenient    for other template engines except ERB.)

* Erubis can convert eRuby file into ruby code correctly. It means that   Erubis can replace ERB in Ruby on Rails. I think that there is no problems   when replacing ERB with Erubis. If not, please report it to me.