2011-12-29 228 views
1

我有以下嵌套的资源用于新的行动POST请求:当Rails的路线产生嵌套资源

resources :listings do 
    resources :offers do 
    member do 
     put "accept" 
     put "reject" 
    end 
    end 
end 

在我的列表/ show.html.haml,我有

= button_to "Make Offer", new_listing_offer_path(@listing) 

现在,我按一下按钮,铁轨产生一个POST请求,因此错误:

Started POST "/listings/2/offers/new" for 127.0.0.1 
ActionController::RoutingError (No route matches "/listings/2/offers/new"): 

如果我刷新(GET请求),那么页面DISPLA ys正确。

我相信这个不正确的路由只发生在我添加两个额外的动作:接受和拒绝,这恰好是POST动作。

这是Rails中的错误,还是我的错?我应该如何防止这个错误?

谢谢。

回答

2

button_to帮助程序会为您创建一个表单,默认情况下,它会向您指定的URL(“/ listings/2/offers/new”)发送POST请求。

您指定的路由不会生成处理POST请求到/ new的路由。您可以通过运行“rake routes”任务来检查您生成的路线和他们将要响应的动词。

如果您只想链接到表单,请将您的“button_to”更改为“link_to”,然后添加CSS以增添美感。

= link_to "Make Offer", new_listing_offer_path(@listing) 

(这GET将路由到您OfferController的新动作)

如果您正在寻找真正POST数据,你可能会需要您的使用情况更改为:

= button_to "Make Offer", listing_offers_path(@listing) 

(此POST会路由到您的OfferController的创建操作。)

+0

感谢Mike。从你的提示中,我意识到我可以添加:method =>:进入button_to。有用。 – AdamNYC 2011-12-29 17:51:31

+0

没问题。是的,这也可以工作,但除非它是搜索表单或其他东西,否则使用表单提交来执行GET只会让我感到尴尬,所以故意留下该解决方案......但它确实有效! – miked 2011-12-29 18:29:27