views:

40

answers:

2

I have a different subheader partial I want to render dependent on where I'm at in my application. How do I go about determining where I'm at via ruby? Or do I need to parse the URL?

Example :

If I'm at my root level I want to use /home/subheader, if I'm in controller 'test' I want to render /test/subheader, etc... etc...

basically looking for this part:

(in my application view)

<%- if  ############ %>
<%= render :partial => '/home/subheader' %>
<%- elsif ########### %>
<%= render :partial => '/test/subheader' %>
<%- else  %>
<%= render :partial => '/layouts/subheader' %>
<%- end %>

Thanks

+2  A: 

You can use current_page?

if current_page? :controller => 'home', :action => 'index'
  do_this
end

or use the controller's method controller_name

if controller.controller_name == 'home'
  do_that
end

If you're using this in a per-controller basis, you should probably need layouts or use different templates, rendering different partials depending in controller/action is a code smell.

P.S: You could also try to get the params[:controller] and params[:action] variables, but I am not sure if they are passed correctly if your route is non the standard /:controller/:action

Chubas
A: 

A slightly easier way to manage this would be to use content_for. For example:

#app/layouts/application.html.erb

<html>
  <body>
    <h1>My Application</h1>
    <%= yield(:subheader) || render(:partial => 'layouts/subheader') %>
    <%= yield %>
  </body>
</html>

This layout will first try to render the subheader content that was passed in from the view, otherwise it will render the partial 'layouts/subheader'. Then in each view that requires a custom subheader, all you have to do is:

#app/views/home/index.html.erb

<% content_for :subheader, render(:partial => 'subheader') %>

And in your other controller, you could use something completely different, like:

#app/views/other/show.html.erb

<% content_for :subheader do %>
  <h2>A different subheader</h2>
<% end %>
theTRON