Forum: Ruby on Rails Strange nil object message

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.
5f954338dc631d03b2b4bcc844900b9d?d=identicon&s=25 Kaushik Ghose (kghose)
on 2005-11-26 07:26
Hi,

I'm on winXP, learning to use RoR to talk with MySQL.

I'm tweaking the .rhtml code in views to change the default look of the
"edit" and "new" pages. I changed the edit.rhtml page so that I get a
list of records in addition to the record editing form. I merely
copy-pasted the code from the list.rhtml page for this.

I get a "nil object" error. If I remove the code that actually lists the
entries and only have the code that writes the column headings
everything goes fine.

Is this a ruby bug?

thanks!
Eea3feaacbe44706164289d068d94828?d=identicon&s=25 petermichaux (Guest)
on 2005-11-26 07:38
(Received via mailing list)
I haven't used scaffolding much but here is my guess.

In the list action it probably has something like

def list
  @items = Items.find(:all)
end

Copy and paste this line to your edit action so that the items are
available
in the view.

-Peter
5f954338dc631d03b2b4bcc844900b9d?d=identicon&s=25 Kaushik Ghose (kghose)
on 2005-11-26 16:15
Hi Peter,

Thanks for your reply. I don't know if I need that. Here is the code

#copied verbatim from list.rhtml
<table>
  <tr>
  <% for column in Note.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr> #This part works just fine

<% for note in @notes %>
  <tr>
  <% for column in Note.content_columns %>
    <td><%=h note.send(column.name) %></td>
  <% end %>
  </tr>
  <% end %> #This part screws up
</table>

#left unchanged for edit.rhtml
<h1>Editing note <%=@note.title%></h1>

<%= start_form_tag :action => 'update', :id => @note %>
  <%= render :partial => 'form' %>
  <%= submit_tag 'Edit' %>
<%= end_form_tag %>

<%= link_to 'Show', :action => 'show', :id => @note %> |
<%= link_to 'Back', :action => 'list' %>


So there is indeed an iterator over notes. Its just odd that I get an
error when this runs from the edit view, but not from the list view.
-kaushik
Eea3feaacbe44706164289d068d94828?d=identicon&s=25 petermichaux (Guest)
on 2005-11-26 19:07
(Received via mailing list)
I don't think it is so strange. Action variables are made available if
then
view. If your edit action does not have @notes then neither will your
view.

Add "@notes = Note.find(:all)" to you edit action.

Peter
5f954338dc631d03b2b4bcc844900b9d?d=identicon&s=25 Kaushik Ghose (kghose)
on 2005-11-26 20:41
Oh you be good Peter!

Yes, that worked. Thanks for your prompt replies. Adding

<% @notes = Note.find(:all) %>

worked.

I'm still not sure why, though, since this code is not there in
list.rhtml and list still works :(

-kaushik
71f1b6b2c3fd9af2e8c52618fb91caa6?d=identicon&s=25 Jules (Guest)
on 2005-11-26 20:49
You have controllers and views. Your views shouldn't contain code such
as
<% @notes = Note.find(:all) %>

This code isn't in the list.rhtml, but it is in the
app/controllers/yourcontroller.rb. Open that controller and look at

def list
@notes = Note.find(:all)
end

This code is executed before the view, so the @notes is in the
list.rhtml view. But in the

def edit
..
end

There isn't @notes = Note.find(:all).

So if you alter it like this:
def edit
..

@notes = Note.find(:all)
end

It will work. You could also do it like this:

def edit
...

list
end

So you call the list action which sets the @notes variable in the edit
action.
Eea3feaacbe44706164289d068d94828?d=identicon&s=25 petermichaux (Guest)
on 2005-11-26 21:24
(Received via mailing list)
On 11/26/05, Kaushik Ghose <kaushik.ghose@gmail.com> wrote:
>
> Oh you be good Peter!
>
> Yes, that worked. Thanks for your prompt replies. Adding
>
> <% @notes = Note.find(:all) %>


I think the view is not the best place to put this. You want this in
your
edit action (not view). Even if you do want it in your view try this in
your
controller file.

def edit

  # your usual edit action code

  # add this line
  @notes = Note.find(:all)

end


I'm still not sure why, though, since this code is not there in
> list.rhtml and list still works :(


because "@notes = Note.find(:all)" is in the list action (not view).
Look
for it. Find it. Scaffold put it there didn't it? It doesn't matter if
you
write the code or scaffold writes the code for you. In either case
@notes
has to be filled. Rails doesn't fill it for you magically. Somewhere
your
code does.

When you had the nil error it was because Rails had never seen @notes
before
and yet you still try to iterate over it. You have to tell Rails to fill
@notes in the edit action if you want to use @notes in the edit view.

Instance variable in an action are available in the associated view.

I hope this makes more sense.

Peter
5f954338dc631d03b2b4bcc844900b9d?d=identicon&s=25 Kaushik Ghose (kghose)
on 2005-11-26 23:12
Hey Jules and Peter,

Thanks for your explanations. RoR is making a bit more sense now. I
never thought to look in the controllers code. Is there a manual or
something that would take me through RoR systematically? The stuff I've
found so far uses exmples, but as I'm finding out, I'm not understanding
the structure of RoR very well.

My skill levels are that I'm fairly experienced in C,C++ and in html and
a bit of css.

thanks
-kaushik
8217faf2bfdfa7daf10135d41ddd421e?d=identicon&s=25 Jeff Cohen (jeff)
on 2005-11-26 23:45
kghose wrote:

> My skill levels are that I'm fairly experienced in C,C++ and in html and
> a bit of css.
>

Check out www.softiesonrails.com, it's for those of us Microsofties
trying to get our heads around concepts in rails.
This topic is locked and can not be replied to.