Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: An elegant way to display a message when there are no elements in database

I realized that I'm writing a lot of code similar to this one:

<% unless @messages.blank? %>   <% @messages.each do |message|  %>     <%# code or partial to display the message %>   <% end %> <% else %>   You have no messages. <% end %> 

Is there any construct in Ruby and/or Rails that would let me skip that first condition? So that would be executed when iterator/loop won't enter even once? For example:

<% @messages.each do |message| %>   <%# code or partial to display the message %> <% and_if_it_was_blank %>   You have no messages. <% end %> 
like image 818
Jakub Troszok Avatar asked Jun 22 '09 15:06

Jakub Troszok


2 Answers

You could also write something like this:

<% if @messages.each do |message| %>   <%# code or partial to display the message %> <% end.empty? %>   You have no messages. <% end %> 
like image 59
Fernando Allen Avatar answered Sep 22 '22 08:09

Fernando Allen


If you use the :collection parameter to render e.g. render :partial => 'message', :collection => @messages then the call to render will return nil if the collection is empty. This can then be incorporated into an || expression e.g.

<%= render(:partial => 'message', :collection => @messages) || 'You have no messages' %> 

In case you haven't come across it before, render :collection renders a collection using the same partial for each element, making each element of @messages available through the local variable message as it builds up the complete response. You can also specify a divider to be rendered in between each element using :spacer_template => "message_divider"

like image 43
mikej Avatar answered Sep 25 '22 08:09

mikej