Rails“NoMethodError”与子资源

时间:2010-04-18 01:14:36

标签: ruby-on-rails methods nested-resources

我是新手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的“新”操作:

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 error "NoMethodError" - My first ruby app)。但是,从我所看到的情况来看似乎并非如此。以下是我的资源在我的路线文件中的显示方式:

resources :states do
  resources :cities
end

当它们不是子资源时,我可以让它工作,但我真的需要将它们作为我未来计划的子资源。任何帮助都会非常感激,因为我已经绞尽脑汁待了几个小时而不是我愿意承认...谢谢!

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

3 个答案:

答案 0 :(得分:2)

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

你的后续回答是有效的,但并不是最好的方法,除非你想看看那些不属于某个州的城市。

希望这有帮助。

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

答案 1 :(得分: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频道,如果你再遇到问题。

答案 2 :(得分:1)

没关系 - 我想我已经明白了......我需要将城市定义为自己的资源,以及国家的子资源。现在它似乎有效。