Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby on Rails: conditionally display a partial

I'm not sure if I'm doing the best approach here, but I have a block of data that I want to show after a search is done and to not be there at all before. First of all, there is nothing to show, and second the model it references is nil so it throws an exception.

I placed this block in a partial template and added it the appropriate spot in my layout. Is there a way to cleanly render the partial conditionally? Is there a better way to approach this problem?

like image 286
Donald Hughes Avatar asked Mar 04 '10 02:03

Donald Hughes


People also ask

How do you render a partial?

Rendering a Partial View You can render the partial view in the parent view using the HTML helper methods: @html. Partial() , @html. RenderPartial() , and @html.

How can you tell Rails to render without a layout?

By default, if you use the :plain option, the text is rendered without using the current layout. If you want Rails to put the text into the current layout, you need to add the layout: true option and use the . text. erb extension for the layout file.

What is Local_assigns?

local_assigns is a Rails view helper method that you can check whether this partial has been provided with local variables or not. Here you render a partial with some values, the headline and person will become accessible with predefined value.


2 Answers

Ruby allows you to do nice things like this:

<%= render :partial => "foo/bar" if @conditions %> 

To make this a bit easier to read and understand, it can be written as:

<%= render(:partial => "foo/bar") if @conditions %> 

render is a function, and you pass it a hash that tells it which partial to render. Ruby allows you to put things on one line (which often makes them more readable and concise, especially in views), so the if @conditions section is just a regular if statement. It can also be done like:

<% if @conditions %>   <%= render :partial => "foo/bar" %> <% end %> 

Edit:

Ruby also allows you to use the unless keyword in place of if. This makes code even more readable, and stops you from having to do negative comparisons.

<%= render :partial => "foo/bar" if !@conditions %> #becomes <%= render :partial => "foo/bar" unless @conditions %> 
like image 55
Mike Trpcic Avatar answered Oct 07 '22 06:10

Mike Trpcic


One easy way is to use a helper method. Helpers tend to be a bit cleaner than putting logic directly in the view.

So, your view might be something like :

<%= render_stuff_conditionally %> 

and your helper would have a method to control this:

def render_stuff_conditionally   if @contional_check     render :partial => 'stuff'   end end 

where obviously things are named more appropriately

like image 33
Pete Avatar answered Oct 07 '22 05:10

Pete