Rails:为什么我得到“No route matches”?

时间:2013-05-03 16:32:37

标签: ruby-on-rails routes

来自routes.rb的

片段:

resources :templates do
  post :add_rates
  resources :rates
  delete :remove_rate
end

现在我尝试在表单中使用“add_rates”路径。 试过两个:

<%= form_for(@template.template_id, :html => {:class=>"form-horizontal"},:url=> { :action=>:add_rates}) do |f| %>

<%= form_tag(:template_add_rates) do %>

但我总是得到:没有路线匹配{:action =&gt;“add_rates”,:controller =&gt;“templates”}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

你做错了:

form_for [@template, :add_rates], html: { class: "form-horizontal } do

form_for @template, url: template_add_rates_path(@template), html: {class: "form-horizontal" } do

模板及其ID和所需的操作(add_rates)都必须作为相同的参数传入。您不能将模板ID作为第一个参数,然后尝试在其上添加其他URL参数。此外,在这两种情况下,您都缺少URL的关键部分。在第一个中,你只是给它一个ID,:add_rates; Rails不能使用任意数字,并且知道它是您提供的模板 ID。在第二种情况下,你给它:template_add_rates;如果没有模板ID,Rails应该如何知道你正在尝试添加费率的哪个模板?您需要将您尝试匹配的路线的所有三个部分都给出:/templates/:template_id/add_rates

您发布的代码还存在许多其他奇怪的问题/错误:

  • @template.template_id应为@template.id,除非您明确偏离了Rails的约定,而这些约定几乎不会永远不会
  • 你的路线很奇怪。您不应该添加add_rate路由,您应该使用嵌套resources :rates行提供的路由。

    您的路线应如下所示:

    resources :templates do
      resources :rates
    end
    

    这为您提供了POST /templates/:template_id/rates等路线,用于创建费率(而不是add_rate路线),DELETE /templates/:template_id/rates/:rate_id用于删除费率(而不是remove_rate路线)。< / p>