Forum: Ruby on Rails RecordNotFound - I'm not understanding the

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.
Big Dave S. (Guest)
on 2007-06-04 22:30
(Received via mailing list)
Hello!  I'm new to rails ad ActiveRecord, and have a very basic
problem.

I have a very basic rails app, which I want to contain computers, and
notes.  Each computer has associated notes.  I'm getting an error I'm
not fully understanding when I try to view a computer.  The view
should include a listing of notes for the associated computer, but
instead, I get this:

Couldn't find Note without an ID

The link that takes the user to the screen with the problem:
<%= link_to 'Show', :action => 'show', :id => computer %>

My controller:
  def show
    @computer = Computer.find(params[:id])
    @notes = Note.find(params[:computer_id])
  end

My view for show:
<% for column in Computer.content_columns %>
<p>
  <b><%= column.human_name %>:</b> <%=h @computer.send(column.name) %>
</p>
<% end %>

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

<%= link_to 'Edit', :action => 'edit', :id => @computer %> |
<%= link_to 'Back', :action => 'list_computers' %>

I realize I'm not setting :computer_id anywhere, but using :id in my
controller for notes gives me the same issue, and I don't want to pull
up notes with a particular id, but notes with a particular associated
computer.  It seems like there should be a simple way to accomplish
this in rails, and I'm just missing it.

Thank you in advance!
James S. (Guest)
on 2007-06-04 22:39
(Received via mailing list)
On Jun 4, 2007, at 2:29 PM, Big Dave S. wrote:
>
> My controller:
>   def show
>     @computer = Computer.find(params[:id])
>     @notes = Note.find(params[:computer_id])
>   end

Presuming you have models along the lines of:

class Computer < ActiveRecord::Base
   has_many :notes
end

class Note < ActiveRecord::Base
   belongs_to :computer
end

What you probably want for the above is:

def show
   @computer = Computer.find(params[:id], :include => :notes)
   @notes = @computer.notes
end

Or if you wanted to search the notes without actually loading the
Computer, and params[:id] included the computer id, you'd want:

def show
   @notes = Note.find_by_computer_id(params[:id])
end

If you haven't read Agile Web D. With Ruby on Rails or one
of the other rails books, it'd definitely be worth your while to do
so, to get a better understanding of how rails handles parameters,
and associations.

James.
Jodi S. (Guest)
on 2007-06-04 22:41
(Received via mailing list)
Cheers,
Jodi
General Partner
The nNovation Group inc.
www.nnovation.ca/blog



On 4-Jun-07, at 2:29 PM, Big Dave S. wrote:

>     @notes = Note.find(params[:computer_id])

Hey Big Dave,

Note.find() is a finder that retrieves the row with the provided
primary key (so Note.find(1) will retrieve note with pk of 1).

To query all notes,

@notes = Note.find(:all, :conditions => ["computer_id = ?", params
[:computer_id])

or better yet, since you've just retrieved the computer, then this
the way to go:

@notes = @computer.notes

sweet eh?

(as James suggested, pickup Pickaxe (er, 'skateboard'). It'll get you
over a bunch of early humps)

Jodi
Jodi S. (Guest)
on 2007-06-04 22:44
(Received via mailing list)
On 4-Jun-07, at 2:38 PM, James S. wrote:

>> The link that takes the user to the screen with the problem:
> class Computer < ActiveRecord::Base
>    @computer = Computer.find(params[:id], :include => :notes)
> If you haven't read Agile Web D. With Ruby on Rails or one
> of the other rails books, it'd definitely be worth your while to do
> so, to get a better understanding of how rails handles parameters,
> and associations.
>
> James.


small correction -

>    @notes = Note.find_by_computer_id(params[:id])
>

will return one row. Note.find_all_by_computer_id will do a find(:all

see my forthcoming announcement on find_by_associations to clean this
up even more

Jodi
James S. (Guest)
on 2007-06-04 23:07
(Received via mailing list)
On Jun 4, 2007, at 2:43 PM, Jodi S. wrote:
> small correction -
>
>>    @notes = Note.find_by_computer_id(params[:id])
>>
>
> will return one row. Note.find_all_by_computer_id will do a find(:all)

Yeah, sorry -- trying to get a response sent out quickly before
getting back to work.

James.
Jacob A. (Guest)
on 2007-06-04 23:27
(Received via mailing list)
Big Dave S. wrote:
>
> The link that takes the user to the screen with the problem:
> <%= link_to 'Show', :action => 'show', :id => computer %>

I think you mean :id => @computer in the above line

--
Cheers,
- Jacob A.
This topic is locked and can not be replied to.