Rails第二次更新时没有路由匹配[POST]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails第二次更新时没有路由匹配[POST]相关的知识,希望对你有一定的参考价值。

我在Rails中有一个表单,如下所示:

= form_for cart, as: :cart, url: backoffice_cart_path(cart) , method: :put,  html: { autocomplete: "off", class: 'cart-quoter' } do |f|

当它呈现时,它显示以下标题

<form action="/backoffice/carts/4" ...>

当我在视图中更新一些东西时,我会返回到同一个地方,但是,如果我再次尝试做同样的事情,它会抛出这个错误

没有路线匹配[POST]“/ backoffice / carts / 3”

这与之前使用的地址完全相同。

关于它可能是什么的任何想法?

注意:

购物车对象从一开始就存在,所以我可以第一次有效地更新对象,但是第二次路由器找不到指定的路由时再次发送它。

在开始时,form_for代码是这样的:

= form_for ['backoffice', cart],  html: { autocomplete: "off", class: 'cart-quoter' } do |f|

我刚刚添加了更多显式代码,试图强制提交表单。

路线存在,但只是为了确定

backoffice_cart GET    /backoffice/carts/:id(.:format)                                     backoffice/carts#show
                PATCH  /backoffice/carts/:id(.:format)                                     backoffice/carts#update
                PUT    /backoffice/carts/:id(.:format)                                     backoffice/carts#update
                DELETE /backoffice/carts/:id(.:format)                                     backoffice/carts#destroy

控制器有一个update方法,那里没有魔法。

答案

替换这个:

= form_for cart, as: :cart, url: backoffice_cart_path(cart) , method: :put,  html: { autocomplete: "off", class: 'cart-quoter' } do |f|

通过

= form_for cart, as: :cart, url: backoffice_cart_path(cart) , html: { autocomplete: "off", class: 'cart-quoter' } do |f|
另一答案

表单对象/记录将自己拥有信息,无论是新记录还是现有记录。您可以致电:

cart.new_record?

如果它返回true,则表示此表单将根据REST资源规则执行POST /create。如果它返回false,那么它将执行PATCH/update(标准现在是PATCH而不是PUT)

理想情况下,您不应在REST资源/记录的表单标记中包含urlmethod参数。你甚至不需要as,因为如果cart是一个名为Cart的类的实例,Rails将确保所有内容都被视为cart,参数明智。

最后,您的标记看起来像:

= form_for cart do |f|
  ... form stuff ...

我知道你在这里使用命名空间,backoffice,所以你可以通过以下方式实现它:

= form_for [:backoffice, cart] do |f| 
  .... form stuff ....

希望这可以解决你的问题。确保购物车来自源,它始终是ActiveRecord模型。当然,您的控制器需要createupdate方法。

另一答案

问题的答案尽可能奇怪。

表单里面有一些手动输入,就像这个

input[type='text' value=item.net_unit_price name="cart[cart_items][][id]"]

其中一个是用这种方式写的

input[type='text' value=item.net_unit_price name="cart[cart_items][price]"]

有一些缺少括号。我修复了这个差异,控制器工作正常。

我不完全理解为什么这是我的问题的解决方案,但是在遇到这种问题时你应该考虑这个问题。看起来像一个充满了一些错误的表单给路由器带来了麻烦,后来铁路中的控制器也带来了麻烦。

以上是关于Rails第二次更新时没有路由匹配[POST]的主要内容,如果未能解决你的问题,请参考以下文章

Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):

GET 和 POST 请求的相同 Rails 4 路由

没有路线匹配 [GET] "/users/sign_out" **Rails 5/Bootstrap 4**

vue 同一个页面第二次跳转路由不刷新问题

useState 在第二次点击时更新状态

Rails:旧数据与新数据不匹配时如何更新片段缓存