[Boulder Ruby Group] RoR question

Robert Campbell rsc at indra.com
Thu Oct 1 19:25:45 EDT 2009


Hey everyone, I'm either blind to the obvious, or I'm being overly  
complicated.

I created a site that tracks events.  Originally (out of ease and  
speed) I created a text field for the location of the event.  My  
users (rightly) got tired of doing the copy/paste shuffle every time  
they wanted to create a new event.  As there were only a handful of  
locations being used I figured it would be nice to break out the  
locations into their own model/controller and create a one-to-many  
association (event has one location, location has many events).  This  
way, I can switch the location selection in the event form to a drop- 
down.  Easy!

The events table now has a location_id foreign key and there's a  
"belongs_to :location" in the events model.  The locations model has  
a "has_many :events" but it doesn't seem really necessary; there's no  
need or desire from the users to list the events by location.  I've  
added it simply because every single example of a one-to-many  
association is built that way, though from what I' can tell  
"has_many" does not require anything in the locations table, it only  
generates a method that runs through the events table looking for a  
matching id in the locations_id foreign-key column. (eg:  
@location.events Follow? :) )

So to just to get things rolling, in views/events/show.html.erb I  
have the following section:
<p>
   <%= @event.location.name %><br />
   <%= @event.location.address1 %><br />
   <%= @event.location.address2 %><br />
   <%= @event.location.city %>, <%= @event.location.state %><br />
   <%= @event.location.zip %><br />
   <%= @event.location.other %><br />
</p>
(there is also a location.label, which is a short nickname used in  
the location drop-down)

Anyway, I figured it would be much more DRY to just call the "show"  
view/action in the Locations controller from within the "show" view  
for an event.  IE, when I "show" and event, it "show"s the location.   
Nice and OO right?

It's either not so easy, or I'm off in left field.

The closest I can get is <%= render 'locations/show' %> but of course  
@location isn't set, so that does nothing.  I tried adding "@location  
= Locations.find(@event.location_id)" to the show action in the  
Events controller, so that the above render would have a @location  
when it got to the view, but I get the error "uninitialized constant  
EventsController::Locations".  (also tried find_by_id)

Not sure what to do, but since I've been banging my head against this  
for two days, I'm a bit numb.  Overload a 'find' method in my  
Location model (not the controller, the model)?  I hate leaving it as  
above, but I since the ugly works, I'll just put white-out on my  
screen whenever I edit that file.

All thoughts welcome!


Bob Campbell




More information about the Bdrg-members mailing list