Ruby on rails OrderController中的NoMethodError#新

Ruby on rails OrderController中的NoMethodError#新,ruby-on-rails,undefined,Ruby On Rails,Undefined,我正在上一堂网络开发课,不幸的是,老师没有回复电子邮件。在这个任务中,我在尝试为我的购物车创建结账屏幕时遇到了一个错误。问题是,教授也没有费心检查他的代码,看看它是否工作,所以我没有正确的解决方案来参考。我认为这本书可能有问题,因为其他人似乎也有类似的问题 我是rubyonrails的不速之客,所以我正在寻找一些帮助来找出这个错误的原因 我可以清楚地看到OrderController#new中的命名错误。但我不知道这意味着我应该做什么 有什么指导吗 order\u controller.rb

我正在上一堂网络开发课,不幸的是,老师没有回复电子邮件。在这个任务中,我在尝试为我的购物车创建结账屏幕时遇到了一个错误。问题是,教授也没有费心检查他的代码,看看它是否工作,所以我没有正确的解决方案来参考。我认为这本书可能有问题,因为其他人似乎也有类似的问题

我是rubyonrails的不速之客,所以我正在寻找一些帮助来找出这个错误的原因

我可以清楚地看到OrderController#new中的
命名错误。但我不知道这意味着我应该做什么

有什么指导吗

order\u controller.rb

class OrdersController < ApplicationController
  include CurrentCart
  before_action :ensure_cart_isnt_empty, only: :new
  before_action :set_cart, only: [:new, :create]
  before_action :set_order, only: [:show, :edit, :update, :destroy]

  # GET /orders
  # GET /orders.json
  def index
    @orders = Order.all
  end

  # GET /orders/1
  # GET /orders/1.json
  def show
  end

  # GET /orders/new
  def new
    @order = Order.new
  end

  # GET /orders/1/edit
  def edit
  end

  # POST /orders
  # POST /orders.json
  def create 
    @order = Order.new(order_params) 
    @order.add_line_items_from_cart(@cart)
    respond_to do |format| 
      if @order.save 
        Cart.destroy(session[:cart_id])
        session[:cart_id] = nil
        format.html { redirect_to store_index_url, notice:'Thank you for your order.' }
        format.json { render :show, status: :created, location: @order } 
      else 
        format.html { render :new } 
        format.json { render json: @order.errors, status: :unprocessable_entity } 
      end 
    end 
  end

  # PATCH/PUT /orders/1
  # PATCH/PUT /orders/1.json
  def update
    respond_to do |format|
      if @order.update(order_params)
        format.html { redirect_to @order, notice: 'Order was successfully updated.' }
        format.json { render :show, status: :ok, location: @order }
      else
        format.html { render :edit }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /orders/1
  # DELETE /orders/1.json
  def destroy
    @order.destroy
    respond_to do |format|
      format.html { redirect_to orders_url, notice: 'Order was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def ensure_cart_isnt_empty
    if @cart.line_items.empty?
      redirect_to store_index_url, notice: 'Your cart is empty'
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_order
      @order = Order.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def order_params
      params.require(:order).permit(:name, :addresss, :email, :pay_type)
    end

end
class OrdersController
由于
@cart
对象是
nil
,因此当您尝试调用
行项目时(l.73),会出现错误,因为
nil类中未包含该方法

因此,
@cart
似乎尚未初始化。我需要查看整个
OrderController
代码才能更准确,但是
sure\u cart\u isnot\u empty
方法可能希望在筛选之前通过一些
方法初始化对象。或者数据库没有返回任何内容

编辑:

查看您的代码后,我认为问题在于以下几行:

  before_action :ensure_cart_isnt_empty, only: :new
  before_action :set_cart, only: [:new, :create]
请注意,在按顺序执行方法之前,
,因此当执行
确保车不为空时,
@cart
不会初始化。您需要按以下方式进行更改:

  before_action :set_cart, only: [:new, :create]
  before_action :ensure_cart_isnt_empty, only: :new

因此,
set\u car
将首先运行,
确保购物车不为空
将找到一个有效的对象。

购物车对象是
nil
,因此当您尝试调用
行项目
(l.73)时,会出现错误,因为该方法未包含在
nil类

因此,
@cart
似乎尚未初始化。我需要查看整个
OrderController
代码才能更准确,但是
sure\u cart\u isnot\u empty
方法可能希望在筛选之前通过一些
方法初始化对象。或者数据库没有返回任何内容

编辑:

查看您的代码后,我认为问题在于以下几行:

  before_action :ensure_cart_isnt_empty, only: :new
  before_action :set_cart, only: [:new, :create]
请注意,在按顺序执行方法之前,
,因此当执行
确保车不为空时,
@cart
不会初始化。您需要按以下方式进行更改:

  before_action :set_cart, only: [:new, :create]
  before_action :ensure_cart_isnt_empty, only: :new

因此,
set\u car
将首先运行,并且
确保\u cart\u不是空的
将找到有效的对象。

谢谢!愚蠢的错误,但下次会记住!非常感谢。愚蠢的错误,但下次会记住!