2016-07-11 17 views
0

Ich versuche, einen Artikel aus dem Produkt zeigen Seite in einen Einkaufswagen hinzufügen. Wenn die Schaltfläche "In den Warenkorb" gedrückt wird, wird ein Bestellartikel in der Datenbank erstellt und an den Einkaufswagen gesendet. Ich habe das Add auf Schaltfläche Warenkorb aus der Index-Seite arbeiten, aber wenn ich es aus der Show Seite versuchen, bekomme ich folgende Fehler und es wird nichts in den Warenkorb gelegt:Keine Route stimmt Fehler beim Hinzufügen von Artikel zum Warenkorb von zeigen Seite Schienen

ActionController::RoutingError (No route matches [POST] "/products/5"): 
    actionpack (4.2.5) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' 
    web-console (2.3.0) lib/web_console/middleware.rb:20:in `block in call' 
    web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch' 
    web-console (2.3.0) lib/web_console/middleware.rb:18:in `call' 
    actionpack (4.2.5) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.2.5) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.2.5) lib/rails/rack/logger.rb:20:in `block in call' 
    activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
    activesupport (4.2.5) lib/active_support/tagged_logging.rb:26:in `tagged' 
    activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `tagged' 
    railties (4.2.5) lib/rails/rack/logger.rb:20:in `call' 
    actionpack (4.2.5) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.6.4) lib/rack/methodoverride.rb:22:in `call' 
    rack (1.6.4) lib/rack/runtime.rb:18:in `call' 
    activesupport (4.2.5) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' 
    rack (1.6.4) lib/rack/lock.rb:17:in `call' 
    actionpack (4.2.5) lib/action_dispatch/middleware/static.rb:116:in `call' 
    rack (1.6.4) lib/rack/sendfile.rb:113:in `call' 
    railties (4.2.5) lib/rails/engine.rb:518:in `call' 
    railties (4.2.5) lib/rails/application.rb:165:in `call' 
    rack (1.6.4) lib/rack/lock.rb:17:in `call' 
    rack (1.6.4) lib/rack/content_length.rb:15:in `call' 
    rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service' 
    /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' 
    /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' 
    /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' 

Produkt/show Seite:

<div class="col-xs-4"> 
    <%= form_for '/order_item', remote: true do |f| %> 
    <h4 class="text-right">Unit Price: <span style="color: green"><%= number_to_currency @product.price %></span></h4> 
    <div class="input-group"> 
     <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %> 
     <div class="input-group-btn"> 
     <%= f.hidden_field :product_id, value: @product.id %> 
     <%= f.submit "Add to Cart", class: "btn btn-primary" %> 
     </div> 
    </div> 
    <% end %> 
</div> 

order_items/create.js.erb

<% if @order.errors.any? || @order_item.errors.any? %> 
    alert("not valid.") 
<% else %> 
    $(".cart-text").html("<%= escape_javascript(render 'layouts/cart_text') %>") 
<% end %> 

Layouts/cart_text.html.erb

<%= link_to "#{current_order.order_items.size} Items in Cart (#{number_to_currency current_order.subtotal})", cart_path, class: "btn btn-link" %> 

Karren/show.html.erb

<div class="shopping-cart"> 
    <%= render "shopping_cart" %> 
</div> 

Karren/_shopping_cart.html.erb

<% if [email protected]_item.nil? && @order_item.errors.any? %> 
    <div class="alert alert-danger"> 
    <ul> 
     <% @order_item.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

<% if @order_items.size == 0 %> 
    <p class="text-center"> 
    There are no items in your shopping cart. Please <%= link_to "go back", root_path %> and add some items to your cart. 
    </p> 
<% else %> 
    <% @order_items.each do |order_item| %> 
    <%= render 'carts/cart_row', product: order_item.product, order_item: order_item, show_total: true %> 
    <% end %> 
<% end %> 

carts_controller.rb

class CartsController < ApplicationController 
    def show 
    @order_items = current_order.order_items 
    end 
end 

routes.rb

resources :products 
resource :cart, only: [:show] 
resources :order_items, only: [:create, :update, :destroy] 

Antwort

0

form_for sollte ein Objekt erhalten, nicht eine Zeichenfolge, wie Sie in form_for '/order_item' tun. Dieses Formular macht wahrscheinlich eine POST zu der gleichen URL, die products/5 sein sollte, die tatsächlich nicht existiert.

Versuch, eine Variable zu initialisieren @order_item im ProductController#show Methode aufgerufen, und Ihre Formulardeklaration wie form_for @order_item do |form|

+0

Das hat funktioniert, danke! – Kris

+0

Cool, vergessen Sie nicht, meine Antwort zu validieren;) –

0

Ich bin mir nicht sicher, was Sie mit Ihrem Verweis auf die Homepage meinen, aber dieser Fehler tritt auf, weil die Anfrage, die Sie machen (POST /products/5), keine passende Route definiert hat.

Die „einfallsreich“ Routen von Rails Karte auf die folgenden HTTP-Verben zur Verfügung gestellt:

Rails Routing Verbs

Ich vermute, dass Sie eine Anfrage an POST /products/:id machen, wenn Sie machen eine Anforderung an einem anderen Endpunkt beabsichtigen.

0

etwas ändern, wenn die current_order Ihre Ansicht verfügbar ist (was ich denke, es ist), von den layouts/cart_text, I denke, du solltest es tun:

<div class="col-xs-4"> 
    <%= form_for current_order, remote: true do |f| %> 
    <h4 class="text-right">Unit Price: <span style="color: green"><%= number_to_currency @product.price %></span></h4> 
    <div class="input-group"> 
     <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %> 
     <div class="input-group-btn"> 
     <%= f.hidden_field :product_id, value: @product.id %> 
     <%= f.submit "Add to Cart", class: "btn btn-primary" %> 
     </div> 
    </div> 
    <% end %> 
</div>