0

...配列を作成するためにorderscontroller#newで使用されます。これは、ビューのフォームフィールドのselectメソッドで使用され、新しい順序を追加することになっています。

そこのハロー、

だから私のエラーはこれです

ルーティングエラー

#の未定義のローカル変数またはメソッド `array_of_payment_types'

これで、新しい注文を送信するためのフォーム用のこの選択フィールドがありますが、ブラウザがフォームを含むページをロードしません。

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

これは、私が2回作成しようとしている配列を使用しています。

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も機能しないのでしょうか。

事前にご協力いただきありがとうございます:-)

さらに詳しい情報...

私がこれでやろうとしているのは、フォームを使用して新しい注文を作成することです。フォームのフィールドの1つに「pay_type」(または英語の支払いタイプ)が入力されます。PaymentTypeテーブルの列:pay_type_nameのエントリから「抽出」されたリストであるオプションをユーザーに提示したいと思います(繰り返しますが、害はありません)。ただし、新しいOrderは、配列を作成したOrder#newアクションの後に作成されます。アレイはどこで/どのように作成すればよいですか?

4

1 に答える 1

0

def array_of_payment_typesOrderクラスでインスタンスメソッドを定義し、それをクラスメソッドとして使用しようとしています。

代わりに、array_of_payment_typesをクラスメソッドとして定義し、ビューで定数ARRAY_OF_PAYMENT_TYPESの代わりにOrder.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 に答える