Forum: Ruby on Rails Overriding layout causes empty response with content_for

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ivan V. (Guest)
on 2008-11-20 05:44
Hi,

I'm trying to pinpoint what the issue might be here. In a controller
that has the appropriate layout (layouts/controller.html.erb), if I try
to override the layout to the 'application' layout only for certain
actions, those actions do get rendered with the application layout...
Like this:

layout 'application', :only => :new

The 'new' action renders fine, but now the other actions don't render at
all!

No error or anything, just an empty response. I've tried renaming the
layout files to see if an error shows up, and no error (so no layout is
being picked up).

On my views I have content_for, so since nothing is yielding those
contents, nothing shows up. If I put something outside a content_for, it
does show up (without a layout of course).

If I explicitly render the layout on the action, it works, like so:

render :layout => 'somelayout'

So what's the deal here?

Thanks in advance!
James E. (Guest)
on 2008-11-20 05:54
(Received via mailing list)
I would try to explicitly specify the layout for the other actions.  If
you
read the docs, you can sort of infer that no layout will be applied if
you
explicitly apply a layout to some actions:
http://api.rubyonrails.org/classes/ActionControlle...

"This will assign "weblog_standard" as the WeblogController's
layout<http://api.rubyonrails.org/classes/ActionControlle...
for the
rss action, which will not wrap a
layout<http://api.rubyonrails.org/classes/ActionControlle...
the rendered view."

Not sure that's the right answer -- just offering.

jim
jim-rants.com

On Wed, Nov 19, 2008 at 10:44 PM, Ivan V.
Ivan V. (Guest)
on 2008-11-20 06:11
After unsuccessfully trying an after_filter to do the render, I did
found out that it is rendering with render_with_no_layout... I was
trying to avoid having an explicit render on every action, and now with
your comment as I re-read the docs, I think I found an oh-so-ugly
solution:

layout proc{ |controller| [ 'new', 'etc'
].include?(controller.action_name) ? 'application' : 'otherlayout' }

Thanks

James E. wrote:
> I would try to explicitly specify the layout for the other actions.  If
> you
> read the docs, you can sort of infer that no layout will be applied if
> you
> explicitly apply a layout to some actions:
> http://api.rubyonrails.org/classes/ActionControlle...
>
> "This will assign "weblog_standard" as the WeblogController's
> 
layout<http://api.rubyonrails.org/classes/ActionControlle...
> for the
> rss action, which will not wrap a
> 
layout<http://api.rubyonrails.org/classes/ActionControlle...
> the rendered view."
>
> Not sure that's the right answer -- just offering.
>
> jim
> jim-rants.com
>
> On Wed, Nov 19, 2008 at 10:44 PM, Ivan V.
Brian P. (Guest)
on 2008-11-20 06:16
Ivan V. wrote:
> Hi,
>
> I'm trying to pinpoint what the issue might be here. In a controller
> that has the appropriate layout (layouts/controller.html.erb), if I try
> to override the layout to the 'application' layout only for certain
> actions, those actions do get rendered with the application layout...
> Like this:
>
> layout 'application', :only => :new
>
> The 'new' action renders fine, but now the other actions don't render at
> all!
>
> No error or anything, just an empty response. I've tried renaming the
> layout files to see if an error shows up, and no error (so no layout is
> being picked up).
>
> On my views I have content_for, so since nothing is yielding those
> contents, nothing shows up. If I put something outside a content_for, it
> does show up (without a layout of course).
>
> If I explicitly render the layout on the action, it works, like so:
>
> render :layout => 'somelayout'
>
> So what's the deal here?
>
> Thanks in advance!


Try this instead: specify a default controller-wide layout, and then
action-specific layouts defined within the action itself via render.

class MyController < ActionController::Base
    layout "default_layout"

    def foo
      render :action => "foo", :layout => "foo_layout"
    end
end

http://api.rubyonrails.org/classes/ActionControlle...
THEBIGO (Guest)
on 2008-11-20 07:58
(Received via mailing list)
Hello - have you tried looking at Ryan B. raiscasts - he has a
couple on layouts that might help
http://railscasts.com/tags/4?page=4
Owen

On Nov 19, 8:16 pm, Brian P. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.