2012-11-20 34 views
1

我有...simple_form爲什麼會生成一條不存在的路線?

/config/routes.rb:

Testivate::Application.routes.draw do 
    resources :areas do 
    resources :heuristics  
    end 
end 

/app/models/heuristic.rb:

class Heuristic < ActiveRecord::Base 
    attr_accessible :area_id 
    belongs_to :area 
end 

/應用/型號/area.rb:

class Area < ActiveRecord::Base 
    has_many :heuristics 
end 

/app/controllers/heuristics_controller.rb:

class HeuristicsController < ApplicationController 
    def new 
    @area = Area.find(params[:area_id]) 
    @heuristic = @area.heuristics.build 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @heuristic } 
    end 
    end 
end 

/app/views/heuristics/new.html.haml:

%h1 New heuristic 
= render 'form' 
= link_to 'Back', area_heuristics_path(@area) 

/應用/視圖/啓發式/_form.html.haml:

= simple_form_for @heuristic do |f| 
    = f.input :foo 
    = f.button :submit 

我從來沒有明確地呼籲heuristics_path,因爲這當然不存在。

爲什麼然後我在http://localhost:3000/areas/1/heuristics/new得到以下錯誤?

NoMethodError in Heuristics#new 
Showing /Users/steven/Dropbox/testivate/app/views/heuristics/_form.html.haml where line #1 raised: 
undefined method `heuristics_path' for #<#<Class:0x007fea3b2ac1a0>:0x007fea3d027608> 
Extracted source (around line #1): 
1: = simple_form_for @heuristic do |f| 

回答

3

您使用嵌套的路線,所以道路不會像單資源。您可以運行rake routes來檢查啓發式資源的路徑。

嘗試改變:

simple_form_for @heuristic do |f| 

要:

simple_form_for @heuristic, url: area_heuristics_path do |f| 
+0

謝謝!這工作。但爲什麼?它在做什麼? –

+0

正如我所說的,你使用了嵌套路由,所以現在你創建新啓發式的路徑不是heuristics_path,它有前綴'area'。你可以檢查通過運行'rake routes'創建的路徑,它會顯示你所有的路徑。 – Thanh

+0

事實上,我從一開始就知道沒有heuristics_path,但我找不到simple_path的這個配置選項(請參閱http://rubydoc.info/search/github/plataformatec/simple_form/master?q=url)。很明顯,你提供的代碼是正確的,因爲它的工作原理,但我不知道爲什麼因爲我已經使用嵌套的URL(http:// localhost:3000/areas/1/heuristics/new),我沒有明確據我所知可以在任何地方調用heuristics_path。有更多可以通過解釋的方式來說嗎? –

相關問題