我是新手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)。
答案 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)
没关系 - 我想我已经明白了......我需要将城市定义为自己的资源,以及国家的子资源。现在它似乎有效。