2016-07-14 4 views
1

J'essaye de faire une application simple de commande de livre dans Ruby on Rails et ai rencontré quelques problèmes. J'essaie de créer une page "passer commande" à partir d'un lien de chaque produit, de sorte que sur cette deuxième page les informations du livre sont là et il y a juste un formulaire pour remplir la quantité désirée par le client. Cependant je continue à courir dans la méthode non définie 'book_id' pour l'erreur nil: NilClass spécifiée ci-dessus (et quand je supprime cette ligne de code, je rencontre la même erreur sur la suivante - méthode indéfinie 'order_id').méthode indéfinie 'book_id' pour nil: NilClass

Voici mon code pour le point de vue que je continue à déconner sur:

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

Mon modèle OrderItem devrait avoir les clés étrangères ORDER_ID et book_id.

Voici mon modèle OrderItem:

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 

Et voici le contrôleur:

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 

En plus de ce qui est mon premier projet Rails, je suis généralement très nouveau pour le codage et apprécierais vraiment de l'aide!

Répondre

0

Votre vue n'obtient pas la variable d'instance @order_item du contrôleur. Si c'est votre point de vue « show » puis dans votre OrderItem Controller vous aurez besoin d'une action définie comme celui-ci par exemple:

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

Je vois aussi un problème potentiel avec vos form..you ont form_for @item_order.quantity. Sortez la partie .quantity de sorte que c'est juste form_for @item_order. Votre formulaire est lié à l'objet @item_order et il saura sauver l'attribut de quantité de la partie f.text_field :quantity du formulaire

0

Ok ... Tout d'abord, you must need a book,order present in the db avant de faire ou de créer items.So vous devez d'abord vérifier si un livre a été créé, créer un ordre, puis utiliser les deux pour créer un article.

donc je suppose, vous aurez le modèle item.rb quelque chose comme: -

belongs_to :book 
belongs_to :order 

Et book.rb

has_many :items,:dependent=>:destroy