Forum: Ruby on Rails Nil result on find & pretty print

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Steven Heimann (Guest)
on 2006-03-18 09:41
(Received via mailing list)
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 %>
  <tr>
  <td>( <%= pp Sdoc.columns.map { |col| col.name } %> ) <%=
sdoc.supplier_id %><br />
  <% supp = Supplier.find(:first, :conditions => [ "suppcode = ?" ,
sdoc.supplier_id]) %>
  <%= supp.suppname %>
  </td>
  <td><%= sdoc.supdesc %><b> /</b><br />
      <%= sdoc.rm_id %> </td>
  <td><%= sdoc.docdate %><br /><%= sdoc.expdate %></td>
  <td><%= sdoc.doctype.docdesc %>
<!--   <% for column in Sdoc.content_columns %>
    <td><%=h sdoc.send(column.name) %></td>
  <% end %>
-->
    <td><%= link_to 'Show', :action => 'show', :id => sdoc %><br />
        <%= link_to 'Edit', :action => 'edit', :id => sdoc %><br />
        <%= link_to 'Destroy', { :action => 'destroy', :id => sdoc },
:confirm => 'Are you sure?' %></td>
  </tr>
<% 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
Steven Beales (Guest)
on 2006-03-18 10:09
(Received via mailing list)
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...
Gustav P. (Guest)
on 2006-03-18 20:05
>>  <%= supp.suppname unless supp.nil? %>

should work, but:

>>  <%= supp.suppname rescue nil%>

will print nil ( '' )
I posted an article on <a
href="http://www.rails.co.za/articles/2006/03/16/newbie-...
</a> about it the other day...

Anyway,
Gustav P.
removed_email_address@domain.invalid
Gustav P. (Guest)
on 2006-03-18 20:06
Woops! Didn't know R-Forum would escape the anchor . . . sorry :]
This topic is locked and can not be replied to.