Question about Rails 2.x behavior

3 views
Skip to first unread message

Yehuda Katz

unread,
Aug 8, 2009, 11:19:12 PM8/8/09
to Ruby on Rails: Core
In Rails 2.x, if you have an XML template, and try to render a template
that does not have an XML version, but does have an HTML version, it
will be rendered. XML and HTML are just examples; this is true for any
two mime types.

Is this behavior important? First of all, I'm not sure this is the right
behavior, since it's possible to be explicit about the format you wish
to use and rendering a template from a different MIME seems likely to be
a mistake. Second of all, it requires us to widen our search criteria
when looking for subsidiary templates (like partials), and prevents us
from efficiently caching the template for a given format (instead, we
need to cache the template for a given Array of formats, which is much
less efficient).

I also think that restricting subsidiary templates would be consistent
with other (non-breaking) fixes we've done to ensure that layouts match
the MIME type of the template they are wrapping (which allowed us to
eliminate the exempt_from_layout hacks).

Thanks for your attention,

-- Yehuda

Jeremy McAnally

unread,
Aug 9, 2009, 12:14:25 AM8/9/09
to Ruby on Rails: Core
Yeah I definitely agree that this should change. It's actually bitten
me a couple of times where I, when writing my initial tests, would
forget to write the XML view, but the test still passed because it
rendered the HTML template. Bad Rails! Bad!

Would love to see this implemented to be more strict.

--Jeremy

Luke Melia

unread,
Aug 9, 2009, 12:41:25 AM8/9/09
to Ruby on Rails: Core
I've always thought this behavior to be strange and would not miss it.
-Luke

Mark Turner

unread,
Aug 9, 2009, 1:11:41 AM8/9/09
to Ruby on Rails: Core
On Aug 8, 8:19 pm, Yehuda Katz <wyc...@gmail.com> wrote:
> In Rails 2.x, if you have an XML template, and try to render a template
> that does not have an XML version, but does have an HTML version, it
> will be rendered. XML and HTML are just examples; this is true for any
> two mime types.
>
> Is this behavior important? First of all, I'm not sure this is the right
> behavior, since it's possible to be explicit about the format you wish
> to use and rendering a template from a different MIME seems likely to be
> a mistake. Second of all, it requires us to widen our search criteria
> when looking for subsidiary templates (like partials), and prevents us
> from efficiently caching the template for a given format (instead, we
> need to cache the template for a given Array of formats, which is much
> less efficient).

I fully agree.

>
> I also think that restricting subsidiary templates would be consistent
> with other (non-breaking) fixes we've done to ensure that layouts match
> the MIME type of the template they are wrapping (which allowed us to
> eliminate the exempt_from_layout hacks).

Its a change that should happen, we should be explicit of the mime
types and our templates.

Michael Koziarski

unread,
Aug 9, 2009, 1:46:23 AM8/9/09
to rubyonra...@googlegroups.com
> In Rails 2.x, if you have an XML template, and try to render a template
> that does not have an XML version, but does have an HTML version, it
> will be rendered. XML and HTML are just examples; this is true for any
> two mime types.

I'm guessing that the historical basis for this behaviour is:

xml.content render :partial=>"post", :object=>post

So long as we support :format=>:html in that call, I think the change
is worth making in 3.0. I'd also suggest that the exception gave a
useful message like:

Template not found: post.xml, found post.html. If that's what you
wanted use render ... :format=>:html

--
Cheers

Koz

Matt Jones

unread,
Aug 9, 2009, 2:04:19 AM8/9/09
to rubyonra...@googlegroups.com

I'd also assume the behavior might be left over from the early days of
bare .erb templates - there are still a few of those in the test
suite, and I remember it was a headache when sorting out the 'JS
responses get wrapped in HTML layouts' mess.

--Matt Jones

Mislav Marohnić

unread,
Aug 9, 2009, 6:42:06 AM8/9/09
to rubyonra...@googlegroups.com
On Sun, Aug 9, 2009 at 05:19, Yehuda Katz <wyc...@gmail.com> wrote:

In Rails 2.x, if you have an XML template, and try to render a template
that does not have an XML version, but does have an HTML version, ...

Am I the only one that didn't understand this first sentence?

How can you have an XML template if that template doesn't have an XML version?

Anyway, I'd like to chip in with a small request (I don't know if it's exactly related to the question) — if you defined extra HTML formats (using Mime::Type.register_alias) in your app (like :mobile and :iphone), I'd like that templates render the other HTML format if the current one isn't available. This is especially useful for partials; index.mobile.erb and index.iphone.erb should both be able to use the _post.html.erb partial.

Kieran P

unread,
Aug 9, 2009, 12:53:00 AM8/9/09
to Ruby on Rails: Core
Hey,

Yes, it should assume a file of the same type, and raise if there
isn't.

i.e.

index.html.erb renders 'example' , should find example.html.erb or
raise

Same with xml:

index.xml.erb renders 'example' , should find example.xml.erb or
raise

But overwrites should be allowed:

index.html.erb renders 'example.xml.erb' , should work

Regards
Kieran

Yehuda Katz

unread,
Aug 9, 2009, 8:06:14 AM8/9/09
to rubyonra...@googlegroups.com


Kieran P wrote:
Hey,

Yes, it should assume a file of the same type, and raise if there
isn't.

i.e.

index.html.erb  renders  'example'  , should find example.html.erb or
raise

Same with xml:

index.xml.erb  renders  'example' , should find example.xml.erb or
raise

But overwrites should be allowed:

index.html.erb  renders  'example.xml.erb' , should work
  
render "example.xml" would work just fine today on master, even with the change I'm proposing.

-- Yehuda

Yehuda Katz

unread,
Aug 9, 2009, 8:08:14 AM8/9/09
to rubyonra...@googlegroups.com
This is actually rather similar to the requirement that RJS templates also be able to render HTML. Essentially, you want to be able to have an alias mime that expands out into several acceptable format extensions. Solution forthcoming :)

Reply all
Reply to author
Forward
0 new messages