未定义的方法'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