Forum: Ruby on Rails Application layout question

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.
Cec9696e15aa93b6ea333fbbcaed2adc?d=identicon&s=25 springbok (Guest)
on 2007-06-11 10:18
(Received via mailing list)
Hi,

I'm a RoR noob so excuse me if this is an obvious question. I've
looked in all my RoR books (I have 5) and tried to find the answer in
the newsgroups but to no avail.

I have an application layout which defines the layout of the site
which has a left and right column and a content column in the middle
(3 col layout).

The left/right column contents can change depending on the current
action, so for example for my login form I do not want anything
displayed in the left but I do for the right. Once logged in I want
something in both columns, the content changes as the user navigates
the site.

My thoughts where to use partials so that the view is responsible for
what gets displayed in these columns. I would have something like this
in the application layout:

            <div id="right">
                 <%= render (:partial => "rightcolumn") %>
            </div> <!-- right -->

I would then define _righcolumn.rhtml for each view.

Is this the correct approach, in those cases where I do not display
anything in either column would I have to include a blank partial???

Thanks.
6b554084eb8bcb53a1c97864d8c4ca0d?d=identicon&s=25 Husein Choroomi (Guest)
on 2007-06-11 11:26
(Received via mailing list)
# in layout file (For ex. application.rhtml)

<div id="right">
  <%= yield :right %>
</div>

<div id="left">
  <%= yield :left %>
</div>


# in any view (*.rhtml) that you want to fill the div...

<% content_for :right do -%>
<!-- your stuff -->
<% end -%>

<!-- and/or -->

<% content_for :left do -%>
<!-- your stuff -->
<% end -%>

HTH
- H

On 6/11/07, springbok <evt@infoware.com.au> wrote:
>
>             <div id="right">
>
> >
>


--
Husein Choroomi
Yucca Intelligence Development
http://www.YuccaHQ.com
588ab1c0a5610a7e160a3b101abb91e6?d=identicon&s=25 MichaelLatta (Guest)
on 2007-06-11 18:23
(Received via mailing list)
That is one approach.  The downside is that you must provide the
partial for every view.

If on the other hand you allow the controller to name the partials you
can share partials between views.  For example:

<div id="right>
  <%= render :partial => @right_partial %>
</div>

Then the controller can do things like:

@right_partial = "shared/shared_view1"

Which references view shared_view1 in the shared directory.

Michael
Ab0b702e7fcc79bb7d2c6c67f64e1b4d?d=identicon&s=25 tmac (Guest)
on 2007-06-11 18:50
(Received via mailing list)
I suspect you may want to use different layouts depending on the
circumstance.  You may also me interested in the nested layouts
plugin(http://agilewebdevelopment.com/plugins/nested_layouts), I've
found it quite useful for these types of things.

good luck!
Tim
Cec9696e15aa93b6ea333fbbcaed2adc?d=identicon&s=25 springbok (Guest)
on 2007-06-12 04:57
(Received via mailing list)
Thanks everyone for your suggestions, I've taken Michael's approach as
I think it will best suit my needs. An added bonus is that I will be
able to share partials in those cases where the same content is
displayed in the left/right columns.
B01fdd12039d82427a4af02360ef5571?d=identicon&s=25 cammo (Guest)
on 2007-06-12 06:07
(Received via mailing list)
I also use conditions in my layout for this kinda stuff a bit, stuff
like

<% unless @user.logged_in==true %>
... do some stuff
<% else %>
... do some other stuff
<% end %>

Doesn't feel as "Railsy" but it's a darn site easier to read and
debug.

Cam
8af37192d1537f5abfef2396c2ddba63?d=identicon&s=25 Adam Stacoviak (Guest)
on 2007-06-12 12:59
(Received via mailing list)
I'm sure this is known, but just to take Michael's example one simple
step further you could add an if statement to only render if the
@right_partial varible has been set.

<div id="right>
  <% if @right_partial %>
    <%= render :partial => @right_partial %>
  <% else %>
    <!-- do other stuff -->
  <% end %>
</div>
This topic is locked and can not be replied to.