View context refactoring

PS: This started as a personal conversation with Nick Sutterer and Aaron Patterson, but I am sending to this mailing list as I think others may find this information useful.

Nick, I could not control myself and pushed some initial code about what we discussed. :wink:

Yehuda have already started and defined some time ago a module called ActionView::Context. If you want to behave as an ActionView::Context, all you need to do is to include this module:

https://github.com/rails/rails/blob/master/actionpack/lib/action_view/context.rb

In order to make this context as slim as possible, I have created the view_renderer (as we discussed):

https://github.com/rails/rails/blob/master/actionpack/lib/action_view/renderer/renderer.rb

Which is now used in the controller:

https://github.com/rails/rails/blob/master/actionpack/lib/abstract_controller/rendering.rb#L134

And here is an example of what is needed to render a controller sinatra style:

https://github.com/rails/rails/blob/master/actionpack/test/controller/new_base/render_context_test.rb#L10-18

There is still a lot more to decouple:

1) There is still some controller - view context - view renderer coupling to iron out (but not a lot). 2) Test cases (AC::TestCase and AV::TestCase are extremely coupled). Particularly, AV::TestCase should be able to run against a minimal AV::Context. 3) Helpers are extremely coupled. If you try to use just one of the helpers in isolation, let's say AV::Helpers::FormHelper, it is likely that it will fail because it does not have many dependencies. Ideally, we would use ActiveSupport::Concern and make such dependencies explicit, as happens in ActionController modules.

José Valim www.plataformatec.com.br Founder and Lead Developer

Cool, José. I started working on decoupling rendering and controller. For instance, AV::Renderer and friends shouldn't need a controller instance. However, PartialRenderer relies on the controller - I don't see the point why the PartialRenderer is responsible for finding a template. Isn't that a concern for the LookupContext? I'd love to see the *Renderer being Renderer and nothing more. Any thoughts on this?

In addition, is there any interesting in restructuring the view tests? I'd move things and make it more obvious where to find what.

Nick

Cool, José. I started working on decoupling rendering and controller. For instance, AV::Renderer and friends shouldn't need a controller instance. However, PartialRenderer relies on the controller - I don't see the point why the PartialRenderer is responsible for finding a template. Isn't that a concern for the LookupContext? I'd love to see the *Renderer being Renderer and nothing more. Any thoughts on this?

The PartialRenderer (or any renderer) is not really finding the template but it is simply preparing all the options that are used when finding the template. To prepare those options, it needs the controller. It should not be hard to decouple these two as the PartialRenderer only needs the class and prefixes from the controller. The prefixes could be stored in the lookup context object (as they are per se lookup information) and I believe the class could be swapped by "prefixes.first".

In addition, is there any interesting in restructuring the view tests? I'd move things and make it more obvious where to find what.

It is ok to restructure if we have clear benefits. I believe making "more obvious where to find what" is somehow subjective. :slight_smile:

> In addition, is there any interesting in restructuring the view tests? > I'd move things and make it more obvious where to find what.

It is ok to restructure if we have clear benefits. I believe making "more obvious where to find what" is somehow subjective. :slight_smile:

In particular, I was thinking about the rendering tests in new_base/ and test/.

Those tests were not refactored nor extracted from the old tests. They were basically new tests added during the Rails 3 refactoring. I think Yehuda was extremely against changing the tests structure because of things that could be lost. He had mentioned that in a presentation, I will check if I can find it.