Ruby on rails 没有与嵌套资源的[DELETE]匹配的路由
我有一个嵌套模型设置,用户有多个制造商,制造商有多条生产线。当我试图从行索引中删除行的实例时,会收到错误的路由消息。我不确定我做错了什么,但可能很简单,希望有人能帮我减轻一些心痛。我读过hartl的东西,但我对嵌套资源和路由仍然非常陌生 ==型号===Ruby on rails 没有与嵌套资源的[DELETE]匹配的路由,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个嵌套模型设置,用户有多个制造商,制造商有多条生产线。当我试图从行索引中删除行的实例时,会收到错误的路由消息。我不确定我做错了什么,但可能很简单,希望有人能帮我减轻一些心痛。我读过hartl的东西,但我对嵌套资源和路由仍然非常陌生 ==型号=== class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable,
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :manufacturers
end
======
class Manufacturer < ActiveRecord::Base
belongs_to :user
has_many :lines
end
class Line < ActiveRecord::Base
belongs_to :manufacturer
end
app/views/lines/index.html.erb
<h1>Listing lines</h1>
<table>
<thead>
<tr>
<th>Name</th>
<th>Manufacturer</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<% @lines.each do |line| %>
<tr>
<td><%= line.name %></td>
<td><%= line.manufacturer_id %></td>
<td><%= link_to 'Show', manufacturer_lines_path(line.manufacturer, line) %></td>
<td><%= link_to 'Edit', edit_manufacturer_line_path(line.manufacturer, line) %></td>
<td><%= link_to 'Destroy', manufacturer_lines_path, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
列出行
名称
制造商
这是试图使用错误的路由帮助程序:
<td><%= link_to 'Destroy', manufacturer_lines_path, method: :delete, data: { confirm: 'Are you sure?' } %></td>
应该是:
<td><%= link_to 'Destroy', manufacturer_line_path(line.manufacturer, line), method: :delete, data: { confirm: 'Are you sure?' } %></td>
manufacturer\u lines\u path
所做的是使用路由辅助程序生成一个路径,例如/manufacturers/1/lines
,它是完全有效的。无效的是,此链接正在向该路由发出DELETE
请求,如果您查看rake routes
输出,您将看到您没有此路由。您可能只有一个用于GET
,另一个用于POST
,但不用于DELETE
因此,解决方案是使用正确的路径辅助工具,manufacturer\u line\u path
,它获取一个manufacturer
对象和一个line
对象,并从中生成一个路由,例如/manufacturers/1/lines/2
。同样,在rake routes
的输出中,您将看到为该路径定义了两条路由。一个获取
、一个放置
、一个补丁
和一个删除
最后一个路由是当您发出
DELETE/manufacturers/1/lines/2
请求时要匹配的,应用程序的路由器将把它路由到linescocontroller
的destroy
操作,在参数中传入manufacturer\u id=1
和id=2
。现在我得到了答案#@momchenr的未定义方法“line”:这是因为在销毁操作中,您引用的是制造商。line
而不是@line
。没有manufacturer.line
,因为manufacturer有很多:line
。啊。现在我得到了未定义的局部变量或方法'lines\uURL'。。。这是否意味着我应该将其更改为:manufacturer\u lines\u path?为了重定向到制造商的行索引页面,请使用“manufacturer\u lines\u url(@manufacturer)”。当您对路线感到困惑时,请参考“rake routes”结果。
<td><%= link_to 'Destroy', manufacturer_lines_path, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'Destroy', manufacturer_line_path(line.manufacturer, line), method: :delete, data: { confirm: 'Are you sure?' } %></td>