views:

204

answers:

3

Hi. I'm a newbie Rails developer who is getting the following error when trying to access the 'new' action on my CityController:

undefined method `cities_path' for #<#<Class:0x104608c18>:0x104606f08>
Extracted source (around line #2): 
1: <h1>New City</h1>
2: <%= form_for(@city) do |f| %>
3:   <%= f.error_messages %>
4: 
5:   <div class="field">

As some background, I have a State model with many Cities. I'm getting this error after clicking on the following link coming from a State show page:

<p>Add a city: <%= link_to "Add city", new_state_city_path(@state) %></p>

When I run 'rake:routes' it says this is a legit route...

For more background, here is the CityController 'new' action:

def new
@city = City.new

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @city }
end
end

Here is the (complete) form in the view:

<%= form_for(@city) do |f| %>
<%= f.error_messages %>

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div class="actions">
  <%= f.submit %>
</div>
<% end %>

This initially made me think that it's a resources/routes issue since it came back with a mention of 'cities_path' (in fact, that's what another person posting to Stack Overflow had wrong (http://stackoverflow.com/questions/845315/rails-error-nomethoderror-my-first-ruby-app). However, that doesn't seem to be the case from what I can see. Here are how my resources look in my routes file:

resources :states do
  resources :cities
end

I can get it working when they are not sub-resources, but I really need to keep them as sub-resources for my future plans with the app. Any help would be very much appreciated, since I've been racking my brains on this for more hours than I would care to admit... Thanks!

(Not sure this matters at all, but I'm running the very latest version of Rails 3 beta2).

+1  A: 

The problem is most likely in this line:

<p>Add a city: <%= link_to "Add city", new_state_city_path(@state) %></p>

It should be :

<p>Add a city: <%= link_to "Add city", new_state_cities_path(@state) %></p>

This is a language nuance, that takes some getting used to. I actually had the same problem. The paths need to be pluralized. I would also check to make sure that your routes.rb file has the pluralized version as well. There should be a line that looks like this:

map.resources :cities

If you have a line that says city instead of cities you should change it to cities. Hope this helps. Another great resource to check out is the #ruby irc channel on freenode, if you run into anymore problems.

mpd
That didn't seem to work. When I go to the state show page it gives me a no method error for cities. I'm wondering if I just have to figure out a way around the nested resources. Thanks for the tip though...
Tchock
Also try changing cities to citys in the path line, sometimes the inflections on plurals doesn't work right.
mpd
A: 

Nevermind - I think I figured it out... I needed to have cities defined as a resource on its own, as well as a sub-resource of states. Now it seems to work.

Tchock
A: 

Your problem is coming from line 2 of your view above, specifically the form_for declaration. As you pointed out, state_city_path is a valid path, but right now, your form is not using this path, it's using city_path. When using nested resources, you need to define everything in terms of that nesting. Your form_for should look something like form_for([@state, @city]) do (I don't remember the exact syntax).

Your follow up answer will work, but isn't exactly the best way to go about it, unless you want to be able to look at cities that are not in the context of a state.

Hope this helps.

PS. The form_for documentation is pretty good, and shows some good examples when using it with resources.

theIV
Thanks! I went back and did this the "right way" (as you suggested), and it is working without having to define the resources twice...
Tchock