0

...在orderscontroller#new中用于创建一个数组,该数组用于视图中表单字段的select方法,它应该添加一个新订单

你好,

所以我的错误是

路由错误

未定义的局部变量或方法 `array_of_payment_types' for #

现在,我有一个表单的选择字段来提交新订单,但是我的浏览器不会加载包含表单的页面:

<div class="field">
    <%= f.label :pay_type %><br />
    <%= f.select :payment_type_id, Order::PAYMENTS_TYPES,
                 :prompt => 'Select a payment method' %>
</div>

这是使用我尝试创建两次的数组:

class Order < ActiveRecord::Base

...
  belongs_to :payment_type

  **PAYMENT_TYPES = array_of_payment_types**

  validates :name, :address, :email
  validates :pay_type, :inclusion => { :in => PAYMENT_TYPES }

...

  **def array_of_payment_types
    PaymentType.pluck(:pay_type_name)
  end**
end

和这里:

class OrdersController < ApplicationController

...

  def new
    @cart = current_cart
    if @cart.line_items.empty?
      redirect_to store_url, :notice => "Your cart is empty"
      return
    end

    **@PAYMENT_TYPES = array_of_payment_types**
    @hide_checkout_button = true
    @order = Order.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @order }
    end
  end

...

end

而创建数组的方法,它从 :pay_type_name 列 Payment_Type 表中“提取”条目,在 order.rb 和 ApplicationController 中都声明了,这里:

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

...

    def array_of_payment_types
      PaymentType.pluck(:pay_type_name)
    end 
end

现在我正在尝试使用与我的应用程序的其他部分相同的过程,只是复制我已经完成的东西。例如,在 OrdersController#new 我有

@cart = current_cart

current_cart 是在 ApplicationsController 中声明的方法,它可以工作。那么为什么 array_of_payment_types 也不起作用呢?

提前感谢您的帮助:-)

更多信息...

我想要做的是创建一个新订单,使用表单,表单中的一个字段输入“pay_type”(或英文支付类型)。我想向用户提供选项,该选项是从 PaymentType 表中的条目“提取”的列表,列 :pay_type_name (我可能会重复自己,但没有害处)。但是新订单是在 Order#new 操作之后创建的,这是我创建数组的地方。我应该在哪里/如何创建数组?

4

1 回答 1

0

def array_of_payment_types在您的 Order 类中定义了一个实例方法,并且您正尝试将其用作类方法。

我只是将 array_of_payment_types 定义为类方法,并在您的视图中调用 Order.array_of_payment_types 而不是常量 ARRAY_OF_PAYMENT_TYPES 。

您始终可以将其缓存在类方法中,无需为此使用常量。

def self.array_of_payment_types
   @array_of_payment_types ||= PaymentType.pluck(:pay_type_name)
end

但是,考虑将支付类型数组的责任留在 PaymentType 类中。Order 类不应该是检索明显受另一个类控制的数据的联系点。

于 2012-11-15T17:18:13.943 回答