Rails没有路由匹配PUT,但是rake路由显示它存在

时间:2016-03-26 15:36:45

标签: ruby-on-rails ruby routes request

我正在尝试实施一个页面,我可以在购物车中为产品添加数量。关于这个的任何好的教程?

所以我尝试使用edit来实现典型的form_for表单,但这样一直给我这样的错误......

<%= form_for(@cart[0]) do |f| %>
  <% if @cart.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@cart.errors.count, "error") %> prohibited this cart from being saved:</h2>

      <ul>
      <% @cart.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

错误:

No route matches {:action=>"show", :controller=>"carts", :id=>nil} missing required keys: [:id]

...请记住,这是edit行动,所以我不知道为什么抱怨show行动。无论如何我已经id: false并将我的主键自定义为cart_id

index.html文件中我自定义参数

<td><%= link_to 'Edit', edit_cart_path(cart, :id => cart.cart_id, :product_id => cart.product_id) %></td>

这就是我在控制器动作中所拥有的

  def edit
    @cart = Cart.where(:cart_id => params[:id], :product_id => params[:product_id])
  end

我已经确认它找到了正确的记录。

所以,我说了所有这一切并决定只做一个form_tag,然后将数量作为参数发送到update动作。与edit.html

中的以下内容类似
<%= form_tag('/carts', method: 'put') do %>
  <%= number_field_tag "Quantity" %>
<% end %>

然后它抱怨没有放置路线,当有...时

    cart GET    /carts/:id(.:format)         carts#show
         PATCH  /carts/:id(.:format)         carts#update
         PUT    /carts/:id(.:format)         carts#update

我会想象这个错误是因为我没有:id因此我决定覆盖put动作,如下所示

  resources :carts, :except => 'put' do
    # put :carts
    put "/carts" => "carts#update"
  end

但我得到了同样的no put route found错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这两条路线都是:

public ActionResult register(FormCollection collection, HttpPostedFileBase FileUpload1){
RegistrationIMG regimg = new RegistrationIMG();
string ext = Path.GetExtension(FileUpload1.FileName);
string path = Server.MapPath("~/image/");
FileUpload1.SaveAs(path + reg.email + ext);
regimg.Image = @Url.Content("~/image/" + reg.email + ext);
db.SaveChanges();}

需要一个id。 id将是您要更新的购物车的ID。像PATCH /carts/:id(.:format) carts#update PUT /carts/:id(.:format) carts#update 这样的内容可以使用,如果您想使用该字符串,则需要将其传递给cart_path(@cart.id)

答案 1 :(得分:0)

您不会显示路线文件中现有的购物车条目。我猜你的路线文件中可能有这样的东西:

resources :carts

如果用户有多个购物车,可以找到...但是通常情况并非如此,是吗?你有一个。它是一个单身人士。因此,您的路线将是:

resource :cart

在你所展示的内容中还有一些看起来不对的东西,我无法涵盖所有​​内容,但这里有几个提示:

我建议使用simple_form之类的东西来简化表单和路由生成。

您在控制器中通过ID获取购物车 - 您是否希望用户能够修改彼此的购物车?可能不是 - 你可能想要@cart = current_user.cart

的内容

...实际上,您是通过购物车ID和 product_id 获取的?真?购物车中只有一种产品吗?我希望购物车has_and_belongs_to_many :products和产品到has_and_belongs_to_many :carts - 因为许多用户可能在购物车中拥有相同的商品,购物车中可能包含许多商品。

这是一个开始 - 祝你好运!

相关问题