Rails路由在嵌套资源中生成对新操作的Post请求

时间:2011-12-29 15:55:11

标签: ruby-on-rails rest routes nested-resources

我有以下嵌套资源:

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

在我的listing / show.html.haml中,我有

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

现在,当我点击按钮时,rails会生成一个POST请求,从而出现错误:

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

如果我刷新(GET请求),则页面显示正确。

我相信这种错误的路由仅在我添加了两个额外的操作时才会发生:接受和拒绝,这恰好是POST操作。

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

您指定的路由不会生成处理/ new的POST请求的路由。您可以通过运行“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的创建操作。)