1

我是一名新手 Rails 开发人员,在尝试访问我的 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">

作为一些背景,我有一个包含许多城市的州模型。单击来自状态显示页面的以下链接后,我收到此错误:

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

当我运行“rake:routes”时,它说这是一条合法的路线......

更多背景信息,这里是 CityController 'new' 动作:

def new
@city = City.new

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

这是视图中的(完整)表单:

<%= 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 %>

这最初让我认为这是一个资源/路线问题,因为它提到了“cities_path”(事实上,这是另一个发布到 Stack Overflow 的人的错误(Rails 错误“NoMethodError” - 我的第一个 ruby​​ 应用程序)。但是,从我所看到的情况来看,情况似乎并非如此。这是我的资源在路由文件中的外观:

resources :states do
  resources :cities
end

当它们不是子资源时,我可以让它工作,但我真的需要将它们作为我未来计划使用该应用程序的子资源。任何帮助都将不胜感激,因为我为此绞尽脑汁的时间比我愿意承认的还要多……谢谢!

(完全不确定这是否重要,但我正在运行最新版本的 Rails 3 beta2)。

4

3 回答 3

2

您的问题来自上面视图的第 2 行,特别是form_for声明。正如你所指出的,state_city_path是一个有效的路径,但现在,你的表单没有使用这个路径,它正在使用city_path. 使用嵌套资源时,您需要根据该嵌套定义所有内容。你form_for应该看起来像form_for([@state, @city]) do(我不记得确切的语法)。

您的后续答案将起作用,但并不是最好的解决方法,除非您希望能够查看不在州范围内的城市。

希望这可以帮助。

PS。form_for 文档非常好,并且在将其与资源一起使用时显示了一些很好的示例。

于 2010-04-18T15:31:35.627 回答
1

问题很可能出在这一行:

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

它应该是 :

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

这是语言的细微差别,需要一些时间来适应。我实际上有同样的问题。路径需要多元化。我还会检查以确保您的 routes.rb 文件也具有复数版本。应该有一行如下所示:

map.resources :cities

如果你有一条写着城市而不是城市的行,你应该把它改成城市。希望这可以帮助。如果您遇到任何问题,另一个值得查看的好资源是 freenode 上的#ruby irc 频道。

于 2010-04-18T07:26:02.600 回答
1

没关系 - 我想我想通了......我需要将城市定义为自己的资源,以及州的子资源。现在它似乎工作了。

于 2010-04-18T15:23:32.803 回答