我在訂購時遇到了麻煩。我發佈了錯誤信息。我認爲這個問題與OrderController.rb中的create方法有關,我確實已經定義了total_price方法,但是..除此之外,我不知道如何解決這個問題。任何幫助,將不勝感激。謝謝。Rails 4:未定義的方法`total_price'爲零:NilClass,訂單控制器
class OrderTransaction
def initialize order, nonce
@order = order
@nonce = nonce
end
def execute
@result = Braintree::Transaction.sale(
amount: order.total_price,
payment_method_nonce: nonce
)
end
def ok?
@result.success?
end
private
attr_reader :order, :nonce
end
class Order < ActiveRecord::Base
belongs_to :user
has_many :order_items
def total_price
order_items.inject(0) { |sum, item| sum + item.total_price }
end
end
class OrdersController < ApplicationController
before_filter :initialize_cart
def index
@orders = Order.order(created_at: :desc).all
end
def create
@order_form = OrderForm.new(
user: User.new(order_params[:user]),
cart: @cart
)
if @order_form.save
notify_user
if charge_user
redirect_to root_path, notice: "Thank you for placing the order."
else
flash[:warning] = <<EOF
Your order ID is #{@order_form.order.id}.
<br/>
Something went wrong.
EOF
redirect_to new_payment_order_path(@order_form.order)
end
else
render "carts/checkout"
end
end
def update
@order = Order.find params[:id]
@previous_state = @order.state
if @order.update state_order_params
notify_user_about_state
redirect_to orders_path, notice: "Order was updated."
end
end
def new_payment
@order = Order.find params[:id]
@client_token = Braintree::ClientToken.generate
end
def pay
@order = Order.find params[:id]
transaction = OrderTransaction.new @order, params[:payment_method_nonce]
transaction.execute
if transaction.ok?
redirect_to root_path, notice: "Thank you for placing the order."
else
render "orders/new_payment"
end
end
private
def notify_user
@order_form.user.send_reset_password_instructions
OrderMailer.order_confirmation(@order_form.order).deliver
end
def notify_user_about_state
OrderMailer.state_changed(@order, @previous_state).deliver
end
def order_params
params.require(:order_form).permit(
user: [ :name, :phone, :address, :city, :country, :postal_code, :email ]
)
end
def charge_user
transaction = OrderTransaction.new @order, params[:payment_method_nonce]
transaction.execute
transaction.ok?
end
def state_order_params
params.require(:order).permit(:state)
end
end
class OrderItem < ActiveRecord::Base
belongs_to :order
belongs_to :product
def total_price
self.quantity * self.product.price
end
end
class OrderForm
include ActiveModel::Model
attr_accessor :user, :order # credit_card
attr_writer :cart
def save
set_password_for_user
if valid?
persist
true
else
false
end
end
def has_errors?
user.errors.any?
end
private
def valid?
user.valid?
end
def persist
user.save
@order = Order.create! user: user
build_order_items
end
def set_password_for_user
user.password = Digest::SHA1.hexdigest(user.email + Time.now.to_s)[0..8]
end
def build_order_items
@cart.items.each do |item|
@order.order_items.create! product_id: item.product_id, quantity: item.quantity
end
end
end
class OrderItem < ActiveRecord::Base
belongs_to :order
belongs_to :product
def total_price
self.quantity * self.product.price
end
end
謝謝你,那是很棒的信息 – JamesRocky