Template "specialisation"

I want to use a sitewide default template and use a specific version in some controllers to have a good DRY approach to my layout. Those controllers should add a little bit more HTML before rendering the results of the actions, in order to avoid copying the entire sitelayout every time. How can I do that? Currently my code is like this:

class WelcomeController < ApplicationController         #before_filter :show_options         layout 'mydefault'

        def contact                 render :partial => "contact"         end

        private                 def show_options                         render :partial => "welcome"                 end end

This only shows the app/views/welcome/_contact.rhtml page. It does not show the layout (that does work in other controllers where I don't use these things). If I then enable the before_filter (is that the right usage, it does not feel like that) then it only shows the app/views/welcome/_welcome.rhtml page, which is not what I want either.

So how should I do this? How should I have this controller use the layout 'mydefault', render the _welcome partial before every method and also render the contact partial when the contact action is called?

I really think I'm not using the right tools here, especially before_filter seems a bit wrong here.

Thanks for your help, Bart

Hi Bart,

The way I would do it is to get rid of the partials from your controller and put them in the views. Keep the layout 'mydefault' at the top of your WelcomeController as you have it. Your 'mydefault' layout should look something like:

header stuff.... <%= render :partial => "welcome" %> <%= @content_for_layout %> footer stuff..

The above layout will always render the "welcome" partial for all actions. You don't need the before filter. For your contact view, you can include whatever you want in its .rhtml view file. So contact.rhtml can have this in it: <% render :partial => "contact" %>

I'm not sure why you would even need the partial. Just put the contents directly in contact.rhtml in your views folder.

Best Regards,

Tamim

Bart Braem wrote:

Hi Tamim (and thanks for your fast reply),

Indeed I should have put the contact stuff in contact.rhtml. But... the mydefault layout is also used for controllers that do not have any welcome information to show. Wouldn't you solution show the welcome partial everywhere?

Regards and thanks, Bart

Tamim Azizadah wrote:

Hi Bart,

From your message, I got the impression that you wanted the _welcome partial to be rendered before every method:

"So how should I do this? How should I have this controller use the layout 'mydefault', render the _welcome partial before every method and also render the contact partial when the contact action is called?"

Another possible way that could work is if you create a simple private method that does this

private def show_welcome   @welcome = true end

Then at the top, you can run your before filter

before_filter :show_welcome

Then in 'mydefault':

header stuff.... <% if @welcome == true %>   <%= render :partial => "welcome" %> <% end %> <%= @content_for_layout %> footer stuff..

There's probably a better way to do it, but that's my brainstorming at the moment.

Best Regards,

Tamim

Bart Braem wrote:

Curtis Summers wrote:

You can also check which controller and/or action you're in from the view and display appropriately. For instance, for all actions in controllers one, two, and three, show the welcome:

<% if params[:controller] =~ /one|two|three/ %> <%= render :partial => "welcome" %> <% end %>

That seems like a good trick! I'll try to use that one.

Regards, Bart

Tamim Azizadah wrote:

There's probably a better way to do it, but that's my brainstorming at the moment.

Your suggestion works, thanks! And sorry if my questions were not entirely clear all the time...

Regards, Bart