未定义的方法'book_id'为零:NilClass

问题描述:

我想在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项目,我一般很新的编码,真的希望一些帮助!

您的看法是没有从控制器获取@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对象,它会知道从形式

确定的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