looping through a list

what is the proper way to loop through a list in a rails view (assuming that you need to check if it is empty or not)

my_list.each do | an_item |   puts "#{an_item}" end

If the list is empty nothing is printed.

Paul Hoehne wrote:

my_list.each do | an_item |   puts "#{an_item}" end

If the list is empty nothing is printed.

should i return my lists from the model?

<%- @records.each do |record| -%>     here you handle each record, doing what has to be done   <%- end -%>

If @records is an empty array or other Enumerable, then the inside of the loop will never be executed. If @records is nil, you'll throw an error.

If you just want to remove all empty elements in your array, before looping, you can just do this in your controller:

  @records.compact!

This removes all nil elements. Then when you loop through it in the view, you only get real records.

Scenario 1:

Brent Miller wrote:

  <%- @records.each do |record| -%>     here you handle each record, doing what has to be done   <%- end -%>

If @records is an empty array or other Enumerable, then the inside of the loop will never be executed. If @records is nil, you'll throw an error.

If you just want to remove all empty elements in your array, before looping, you can just do this in your controller:

  @records.compact!

This removes all nil elements. Then when you loop through it in the view, you only get real records.

so should I always do a nil check on @records before I loop through the records?

If you use a find(:all, ...) method you will get back a collection of an empty collection. If you navigate a relationship you will get a collection or an empty collection. Generally, in rails, methods that return a collection will return an empty collection, not nil.

If, however, you have code like:

def some_action   @thing = MyModel.find(params[:id])   if @thing.some_test     @list_of_stuff = @thing.children   end end

Then you would need to test @list_of_stuff to see if it's nil. But that's probably bad form.

Paul Hoehne wrote:

If you use a find(:all, ...) method you will get back a collection of an empty collection. If you navigate a relationship you will get a collection or an empty collection. Generally, in rails, methods that return a collection will return an empty collection, not nil.

If, however, you have code like:

def some_action   @thing = MyModel.find(params[:id])   if @thing.some_test     @list_of_stuff = @thing.children   end end

Then you would need to test @list_of_stuff to see if it's nil. But that's probably bad form.

thanks guys. I found that my problem was that i was using find_all_by incorrectly and it was returning nil.