2016-07-14 11 views
1

Ich versuche, eine einfache Buchbestellungsanwendung in Ruby on Rails zu machen und habe einige Probleme bekommen. Ich versuche, von jedem Produkt eine "Bestellung aufgeben" -Seite zu erstellen, so dass auf dieser zweiten Seite die Buchinformationen vorhanden sind und dann nur noch ein Formular zum Ausfüllen der vom Kunden gewünschten Menge vorhanden ist. Allerdings laufe ich weiter in die undefinierte Methode 'book_id' für nil: NilClass Fehler oben (und wenn ich diese Codezeile lösche, laufe ich in den gleichen Fehler auf dem nächsten - d. H. Undefinierte Methode 'order_id').undefined Methode 'book_id' für nil: NilClass

Hier ist mein Code für die Ansicht, die ich immer wieder vermasselt:

<%= @order_item.book_id %> 
<%= @order_item.order_id %> 
<%= @order_item.total_pricel %> 
<%= form_for @order_item.quantity do |f| %> 
<%= f.label :quantity %>: 
<%= f.text_field :quantity %><br /> 
<%= f.submit %> 
<% end %> 

Mein OrderItem Modell der Fremdschlüssel ORDER_ID und book_id haben sollte.

Hier ist mein OrderItem Modell:

class OrderItem < ActiveRecord::Base 
belongs_to :order 
belongs_to :book 

validates :quantity, presence: true, numericality: {only_integer: true, greater_than: 0} 
validate :book_present 
validates :price, presence: true 
validate :order_present 

def unit_price 
    if persisted? 
     self[:unit_price] 
    else 
     book.price 
    end 
end 

def total_price 
    unit_price * quantity 
end 

private 
    def book_present 
     if book.nil? 
      errors.add(:book, "is not valid.") 
     end 
    end 


def order_present 
    if order.nil? 
     errors.add(:order, "is not a valid order.") 
     end 
    end 

def finalize 
    self[:unit_price] = unit_price 
    self[:total_price] = quantity * self[:unit_price] 
end 
end 

Und hier ist der Controller:

class OrderItemsController < ApplicationController 

def create 
    @order = current_order 
    @order_item = @order.order_items.new(order_item_params) 
    @order.save 
    session[:order_id] = @order.id 
end 

def update 
    @order = current_order 
    @order_item = @order.order_items.find(params[:id]) 
    @order_item.update_attributes(order_item_params) 
    @order_items = @order.order_items 
end 

def destroy 
    @order = current_order 
    @order_item = @order.order_items.find(params[:id]) 
    @order_item.destroy 
    @order_item = @order.order_items 
end 

private 
def order_item_params 
    params.require(:order_item).permit(:quantity, :book_id) 
end 
end 

Zusätzlich zu dieser ist mein erstes Rails-Projekt, ich bin im Allgemeinen sehr neu für Codierung und würde wirklich zu schätzen, etwas Hilfe!

Antwort

0

Ihre Sicht empfängt die @order_item Instanzvariable nicht vom Controller. Wenn es auf ‚Show‘ Ansicht ist dann in Ihren OrderItem-Controller benötigen Sie eine definierte Aktion, wie dies zum Beispiel:

def show 
    @order_item = OrderItem.find(params[:id]) 
end 

ich auch ein potenzielles Problem bei Ihrer form..you form_for @item_order.quantity hat. Nehmen Sie den .quantity Teil heraus, so dass es nur form_for @item_order ist. Das Formular wird an das @item_order Objekt gebunden und es wird wissen, die Menge Attribut aus dem f.text_field :quantity Teil des Formulars speichern

0

Ok ... Zunächst einmal you must need a book,order present in the db, bevor Sie machen oder erstellen items.So Sie erste Prüfung benötigen Wenn ein Buch erstellt wurde, wird die Bestellung erstellt und dann beide zum Erstellen des Artikels verwendet.

Also gehe ich davon aus, Sie item.rb Modell wie etwas haben: -

belongs_to :book 
belongs_to :order 

Und book.rb

has_many :items,:dependent=>:destroy 
Verwandte Themen