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

时间:2017-12-20 05:08:02

标签: ruby-on-rails routing

我在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方法,没有魔法。

3 个答案:

答案 0 :(得分:0)

替换它:

= 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|

答案 1 :(得分:0)

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

进行检查
POST

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

理想情况下,REST资源/记录的表单标记中不应包含methodas个参数。这里甚至不需要cart,因为如果Cart是名为cart的类的实例,则Rails将确保所有内容都被视为= form_for cart do |f| ... form stuff ... ,参数明智。

最后,您的代码如下所示:

backoffice

我知道你在这里使用名称空间= form_for [:backoffice, cart] do |f| .... form stuff .... ,所以你可以通过以下方式实现它:

create

希望这可以解决您的问题。确保购物车来自源,它始终是ActiveRecord模型。当然,您的控制器需要updateDELETE my_index PUT my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer", "filter": ["lowercase"] } }, "tokenizer": { "my_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 25, "token_chars": [ "letter", "digit" ] } } } }, "mappings": { "product": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 }, "search": { "type": "text", "search_analyzer": "standard", "analyzer": "my_analyzer" } } } } } } } PUT my_index/product/1 { "name" : "Kit Guirlande Guinguette 50m Transparent", "field2": "foo" } PUT my_index/product/2 { "name": "Guirlande Guinguette Blanc 20 Bulbes 10M", "field2": "foo" } GET my_index/product/_search { "query": { "multi_match": { "query": "Guirlande Gui", "fields": [ "name.search", "field2" ], "minimum_should_match": "100%" } }, "highlight": { "fields": { "name.search": { "highlight_query": { "match": { "name.search": { "query": "Guirlande Gui" } } } } }, "type" : "unified" } } 方法。

答案 2 :(得分:0)

问题的答案尽可能奇怪。

表单里面有一些手动输入,比如这个

A::evaluate

其中一个就是这样写的

b

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

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