avoiding exceptions in views

when rendering a view, if the object being rendered doesn't respond to a method it raises an error message. For example, I have an Employee class and each employee has many Tasks. So I may call: <%= employee.tasks.first.task_name %>

If, for some reason an employee has 0 tasks associated with it, the above template method would raise an exception. Is it efficient to loop through the @employees array, with something like:

@employees = Employee.find(:all,...).collect{|e| e if e.tasks.size > 0}.compact

or is there a better way?

thanks for reading.

Oliver Fox wrote:

<%= employee.tasks.first.task_name %>

If, for some reason an employee has 0 tasks associated with it, the

...

@employees = Employee.find(:all,...).collect{|e| e if e.tasks.size > 0}.compact

Your controller is not controlling your view enough! To present only employees with tasks, try this abomination:

  Employee.find(:all).select{|e| e.tasks.any? }

That's the same as yours, but it uses select.

If that melts your database server, try some variation on:

  Employee.find(:all, :include => :tasks,                  :conditions => 'tasks.id is not null')

There might be better or alternate ways. Another one is this:

   <%= (employee.tasks + [Task.new]).first.task_name %>

Then at least the .first-ed array always has a blank Task on the end with a blank .name. You didn't specify if your view should view taskless employees. (And shame on them for slacking!!:wink: