Hi all... I just spent the better part of an hour wrestling with a finicky situation, and since there was some discussion earlier regarding multiple layouts, I thought I''d share my experience in the hope it might save someone a bit of hair-pulling :) In one of my controllers, I had these actions: def welcome end def welcome_xml end def math end def math_xml end The actions sans "_xml" are simple actions that render a view. The only difference between them is the layout used: welcome uses a one column layout while math uses a two column layout. The two actions that do have "_xml" are for generating xml packets of some statistics that are related to the non-xml actions. They are sort of like a web service in that they will be consumed by external sources (flash movies, etc). As it was, I didn''t want the xml actions rendered in a layout, which is where my choose_layout method came from: def choose_layout if action_name == ''welcome'' ''one_column'' elsif ![''welcome_xml'', ''math_xml''].include?(action_name) ''two_column'' else nil end end Using that, I got the results I desired. Until the "let''s do things the right way" bug bit me. I looked at the xml actions and thought, "I should be using respond_to", so I set about making the modifications. I changed the non xml actions to be def welcome/math # do something respond_to do |format| format.html format.xml end end and made sure that my view files were welcome.rhtml/rxml and math.rhtml/rxml. The stage was set for rails goodness to "Just Work"...but it didn''t. When I hit /controller/math.xml, I got an error about malformed xml. As it turned out, the xml was being rendered in a layout. Since the action names were no longer ''welcome_xml'' and ''math_xml'', the choose layout method wasn''t working as it once did. So I tried this: format.xml {render :layout => false} thinking that the xml view would be rendered without a layout. Well, it was, almost. A layout was not used, but for some reason that I could not determine, the rhtml view was rendered instead of the rxml view, even though my url was /controller/math.xml. Much googling didn''t really turn up a silver bullet, but enough little pricks in the brain were generated to get some ideas formulating. I did some experimenting with action_name and concluded that even though I used math.xml, the action name was still math. The only way to tell the difference between the requests was to know what the format is. On a whim, I inspected params[:format] when I hit /controller/math.xml. And there it was, as big as life, "xml". Woohoo! I ended up changing my choose_layout method to consider params [:format], like so: def choose_layout if params[:format] == ''xml'' nil elsif action_name == ''welcome'' ''one_column'' else ''two_column'' end end and taking the {render :layout => false} off of the format.xml line. So now it all works the way I expect, and want, it to. Hopefully this will help someone (and maybe make up for my silly mistakes earlier today ;) ). Peace, Phillip --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi, On Dec 3, 2007 9:48 PM, Phillip Koebbe <phillipkoebbe-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > Hi all... > > I just spent the better part of an hour wrestling with a finicky > situation, and since there was some discussion earlier regarding > multiple layouts, I thought I''d share my experience in the hope it > might save someone a bit of hair-pulling :) > > In one of my controllers, I had these actions: > > def welcome > > end > > def welcome_xml > > end > > def math > > end > > def math_xml > > end > > The actions sans "_xml" are simple actions that render a view. The > only difference between them is the layout used: welcome uses a one > column layout while math uses a two column layout. The two actions > that do have "_xml" are for generating xml packets of some statistics > that are related to the non-xml actions. They are sort of like a web > service in that they will be consumed by external sources (flash > movies, etc). As it was, I didn''t want the xml actions rendered in a > layout, which is where my choose_layout method came from: > > def choose_layout > if action_name == ''welcome'' > ''one_column'' > elsif ![''welcome_xml'', ''math_xml''].include?(action_name) > ''two_column'' > else > nil > end > end > > Using that, I got the results I desired. Until the "let''s do things > the right way" bug bit me. I looked at the xml actions and thought, > "I should be using respond_to", so I set about making the > modifications. I changed the non xml actions to be > > def welcome/math > # do something > > respond_to do |format| > format.html > format.xml > end > end > > and made sure that my view files were welcome.rhtml/rxml and > math.rhtml/rxml. The stage was set for rails goodness to "Just > Work"...but it didn''t. When I hit /controller/math.xml, I got an > error about malformed xml. As it turned out, the xml was being > rendered in a layout. Since the action names were no longer > ''welcome_xml'' and ''math_xml'', the choose layout method wasn''t working > as it once did. So I tried this: > > format.xml {render :layout => false} >format.xml { render :xml => @foo.to_xml }> > thinking that the xml view would be rendered without a layout. Well, > it was, almost. A layout was not used, but for some reason that I > could not determine, the rhtml view was rendered instead of the rxml > view, even though my url was /controller/math.xml. > > Much googling didn''t really turn up a silver bullet, but enough > little pricks in the brain were generated to get some ideas > formulating. I did some experimenting with action_name and concluded > that even though I used math.xml, the action name was still math. > The only way to tell the difference between the requests was to know > what the format is. On a whim, I inspected params[:format] when I > hit /controller/math.xml. And there it was, as big as life, "xml". > Woohoo! I ended up changing my choose_layout method to consider params > [:format], like so: > > def choose_layout > if params[:format] == ''xml'' > nil > elsif action_name == ''welcome'' > ''one_column'' > else > ''two_column'' > end > end > > and taking the {render :layout => false} off of the format.xml line. > So now it all works the way I expect, and want, it to. > > Hopefully this will help someone (and maybe make up for my silly > mistakes earlier today ;) ). > > Peace, > Phillip > > > > > HTH,Michael Guterl --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Michael, On Dec 6, 2007, at 12:25 AM, Michael Guterl wrote:> > format.xml {render :layout => false} > > format.xml { render :xml => @ foo.to_xml } >If I had a single object that could be rendered to xml, then, yes, this would have been the simplest and most correct approach. But as it turns out, there is some logic in my rxml view that does some calculations before it renders the xml. I''ll do some checking to see if there is an easier way for me to accomplish what I need to. Thanks for the comment. Peace, Phillip --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---