2016-07-14 194 views
1

我想在Ruby on Rails上做一個簡單的圖書訂購應用程序,並且遇到了一些問題。我試圖從每個產品的鏈接中創建一個「訂購」頁面,以便在第二頁上顯示書籍信息,然後填寫顧客需要的數量。然而,我一直運行到上面指定的nil:NilClass錯誤的未定義方法'book_id'中(並且當我刪除那行代碼時,我在下一行中遇到相同的錯誤 - 即未定義的方法'order_id')。未定義的方法'book_id'爲零:NilClass

這裏是我的,我一直在搞亂視圖代碼:

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

我OrderItem的模型應該有外鍵ORDER_ID和book_id。

這裏是我的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 

而這裏的控制器:

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 

除了這個是我第一次的Rails項目,我一般很新的編碼,真的希望一些幫助!

回答

0

您的看法是沒有從控制器獲取@order_item實例變量。如果這是你的「秀」視圖然後在OrderItem的控制器,你需要這樣的定義採取行動,例如:

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

我也看到了潛在的問題與您的form..you有form_for @item_order.quantity。取出.quantity部分,這就是form_for @item_order。您的形式被綁定到@item_order對象,它會知道從形式

0

確定的f.text_field :quantity部分保存數量屬性...首先,you must need a book,order present in the db你做之前或創建你需要先檢查items.So如果創建了一本書,則創建訂單,然後使用它們來創建項目。

所以我想,你item.rb車型將擁有類似: -

belongs_to :book 
belongs_to :order 

而且book.rb

has_many :items,:dependent=>:destroy 
相關問題