Nil object for nested resource


#1

Hi all,

I have 2 models with a standard 1 to many relationship. I’m also using
REST on the two models and have added the appropriate code to the
routes.rb file.

scorecard.rb:
class Scorecard < ActiveRecord::Base
has_many :attributes
end

attribute.rb:
class Attribute < ActiveRecord::Base
belongs_to :scorecard
end

routes.rb:
map.resources :scorecards do |scorecard|
scorecard.resources :attributes
end

My problem is that I want to show a single scorecard with all it’s
attributes. I then want to display a “New attribute” link to add a new
attribute to the current scorecard.

scorecards/show.rhtml:
<%= label_for(“scorecard”) %>
<%=h @scorecard.name %>

<%= label_for(“template”) %>
<%=h @scorecard.template %>

Attributes:

<% for attribute in @scorecard.attributes %> <% end %>
<%=h attribute.name %> <%=h attribute.weight %>
<%= link_to "New Attribute", new_attribute_path(@scorecard) %>

However I get the message for line 17 (last line) when I try to view
this page,

You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.to_sym

I have tried checking against various REST and Rails books and articles,
and I thought I had used the correct syntax for creating a link to a new
attribute from this scorecard.

Any help on this would be greatly appreciated.

Thanks,

Matthew


#2

I think you may need to rename your Attribute model. ActiveRecord
objects already have an instance variable named “attributes” which
holds the attributes for the given model instance. The Scorecard’s
has_many :attributes collection and the pre-existing attributes hash
are probably colliding.

-John

On Jun 19, 7:19 am, Matthew L. removed_email_address@domain.invalid


#3

Problem solved!

In the routes.rb file I had the following

map.resources :scorecards do |scorecard|
scorecard.resources :perspectives
end

map.resources :perspectives do |perspective|
perspective.resources: scores
end

when I should have had

map.resources :scorecards do |scorecard|
scorecard.resources :perspectives do |perspective|
perspective.resources :score
end
end

Thanks,

Matthew