Nil result on find & pretty print


#1

I am new to Ruby and to Ruby on Rails and have spent the last few days
trying to get my head around it. I think I am already hooked but am
suffering badly from years of programming a non-OO RDBMS. I am trying
to learn by attempting to produce a system for my work.

I have a main table sdocs which has a field supplier_id which is an
entry in another table (suppliers) to lookup supplier name etc. At the
moment I am not using the id field of suppliers in an attempt to get
around the following error. (The agile development book suggests that
the nil error only results from a search on a key and not from a search
on other fields but I am still having the problem.)

“You have a nil object when you didn’t expect it!
The error occured while evaluating nil.suppname”

Sorry the code is such a mess at the moment because I have tried many
different possible solutions.

Part of the code follows:

<% require ‘pp’ %>
<% for sdoc in @sdocs %>

( <%= pp Sdoc.columns.map { |col| col.name } %> ) <%= sdoc.supplier_id %>
<% supp = Supplier.find(:first, :conditions => [ "suppcode = ?" , sdoc.supplier_id]) %> <%= supp.suppname %> <%= sdoc.supdesc %> /
<%= sdoc.rm_id %> <%= sdoc.docdate %>
<%= sdoc.expdate %> <%= sdoc.doctype.docdesc %> <%= link_to 'Show', :action => 'show', :id => sdoc %>
<%= link_to 'Edit', :action => 'edit', :id => sdoc %>
<%= link_to 'Destroy', { :action => 'destroy', :id => sdoc }, :confirm => 'Are you sure?' %> <% end %>

Where it tries to display supp.suppname I originally had
sdoc.supplier.suppname. This was when I had a link
using foreign keys. This works if the foreign key is always present and
always correct but this is not the case with this database.

I have googled for this problem but the suggested solutions do not seem
to work. Things like the following have not helped.

<% if sdoc.supplier.nil %>
“test”
<% else %>
<%= sdoc.supplier.suppname %>
<% end %>

I am sure this is all because of my ignorance but I haven’t been able to
find a solution.

As part of debugging I tried pp as above. This is a line straight out
of the agile development book but produces nothing.

Thank you for your help
Steven


#2

Hi Steven

<% supp = Supplier.find(:first, :conditions => [ “suppcode = ?” ,
sdoc.supplier_id]) %>

After above line, supp will be nil if no suppliers satisfy the search
conditions so just do this

<%= supp.suppname unless supp.nil? %>

or you can add a to_s method to your supplier model like so

def to_s
suppname
end

then you can use <%= supp.to_s %> … which doesn’t need a conditional
because nil.to_s evaluates to ‘’

Steven Beales

“Steven Heimann” removed_email_address@domain.invalid wrote in
message news:removed_email_address@domain.invalid…


#3

<%= supp.suppname unless supp.nil? %>

should work, but:

<%= supp.suppname rescue nil%>

will print nil ( ‘’ )
I posted an article on www.rails.co.za
about it the other day…

Anyway,
Gustav P.
removed_email_address@domain.invalid


#4

Woops! Didn’t know R-Forum would escape the anchor . . . sorry :]