我在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资源/记录的表单标记中包含url
或method
参数。你甚至不需要as
,因为如果cart
是一个名为Cart
的类的实例,Rails将确保所有内容都被视为cart
,参数明智。
最后,您的标记看起来像:
= form_for cart do |f|
... form stuff ...
我知道你在这里使用命名空间,backoffice
,所以你可以通过以下方式实现它:
= form_for [:backoffice, cart] do |f|
.... form stuff ....
希望这可以解决你的问题。确保购物车来自源,它始终是ActiveRecord模型。当然,您的控制器需要create
和update
方法。
问题的答案尽可能奇怪。
表单里面有一些手动输入,就像这个
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]"]
有一些缺少括号。我修复了这个差异,控制器工作正常。
我不完全理解为什么这是我的问题的解决方案,但是在遇到这种问题时你应该考虑这个问题。看起来像一个充满了一些错误的表单给路由器带来了麻烦,后来铁路中的控制器也带来了麻烦。