0

ここでの2番目の質問です。これを自分で解決したいのですが、どこからデバッグを開始すればよいかわかりません。

これがブラウザのエラーです(チェックアウトしてorder / _form.html.erbに詳細を入力すると発生します)

OrdersController#newのArgumentError

少なくとも1つの検証を提供する必要があります

Rails.root:C:/ Users / Ruby / rails_practice/depot4アプリケーショントレース| フレームワークトレース| フルトレース

app / models /payment_type.rb:6:in'app <class:PaymentType>' app/models/payment_type.rb:1:in/ models / order.rb:7:in <class:Order>' app/models/order.rb:1:in' app / controllers /orders_controller.rb:1:in `'

そして、これがOrdersControllerの新しいdefです。

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

  @hide_checkout_button = true
  @order = Order.new

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

問題は、私がdef newに触れていないことです。私は、ここにあるdefcreateに取り組んでいます。

def create
  @order = Order.new(params[:order])
  @order.add_line_items_from_cart(current_cart)
  @cart = current_cart
  @hide_checkout_button = true
  pay_type = PaymentType.find( :conditions => ['pay_type = ?', @order.pay_type] )
  @order.payment_type_id = pay_type.id

  respond_to do |format|
    if @order.save
      Cart.destroy(session[:cart_id])
      session[:cart_id] = nil
      format.html { redirect_to(store_url, :notice => 'Thank you for your order.') }
      format.json { render json: @order, status: :created, location: @order }
    else
      format.html { render action: "new" }
      format.json { render json: @order.errors, status: :unprocessable_entity }
    end
  end
end

私がそこでやろうとしているのは、どのカートとどのカートでbelongs_toあるかの注文を作成することです。payment_typehas_many line_itemsbelongs_to

ちなみに、hide_checkout_button注文ページを表示しているときに、インスタンス変数を使用しようとしています。

Ordersテーブルにはテーブルへの外部キーがあり、ユーザーが送信したこのテーブルPaymentTypesから正しいIDを見つけようとしています。PaymentTypespayment_type

これらの2行をコメントアウトすると:

pay_type = PaymentType.find( :conditions => ['pay_type = ?', @order.pay_type] )
@order.payment_type_id = pay_type.id

時々私は別のエラーを受け取ります:

OrdersController#newのNoMethodError

未定義のメソッド`key? ' nilの場合:NilClass

これはブラウザのキャッシュが正しくないことと関係があると思いますが、接続が何であるかはわかりません。

これを最初に投稿した後、残りの部分で更新します


パートドゥ

これが検証に関するものであることは知っていますが、何が間違っているのかわかりません... order.rb:

class Order < ActiveRecord::Base
  attr_accessible :address, :email, :name, :pay_type, :payment_type_id, :cart_id, 
  :product_id

  has_many :line_items, :dependent => :destroy
  belongs_to :payment_type

  PAYMENT_TYPES = PaymentType.pluck(:pay_type)

  validates :name, :address, :email, :pay_type, :presence => true
  validates :pay_type, :inclusion => PAYMENT_TYPES

そして、あなたはその反対側を持っていbelongs_toますpayment_type.rb

class PaymentType < ActiveRecord::Base
  attr_accessible :pay_type

  has_many :orders

  validates ***:pay_type,*** :uniqueness
end

私は完全に混乱していることを知っていますが、機能テストで1つ失敗し、注文の更新に関係する1つのエラーがありますが、まだ何がわかりません。私はそれらを解決することによって私がこの奇妙なエラーをうっかり解決するかどうかを確認するためにそれらに取り組むつもりです。

誰かが私にレールでのハッキングとデバッグに関するヒントを教えてくれるなら、それは素晴らしいことです。ここにすべてを入力しなくても、これを解決できるようにしたいと思います。

この場合、サーバートレースはブラウザウィンドウよりも多くの情報を提供するとは思いませんが、それが必要な場合、または他に何か質問してください。

アップデート:

だから私の問題は、payment_type.rbのグローバル変数でそれを解決する方法を知っているということですが、これは、Ordersテーブルに支払いタイプの1つの列があり、別の列に名前とpayment_type_idsの別の列があることを意味します。これは外部キーです。

外部キーを持っているので、Ordersテーブルのpayment_typesに特定の列は必要ありません。OrdersビューのPaymentTypeテーブルから値を確認できるはずです。

グローバル変数なしでこれをどのように行いますか?

更新deux:

わかりました、それで私はこれまでにこれを投稿したことはありません(orders_form.html.erbから):

26:   <div class="field">
27:     <%= f.label :pay_type %><br />
28:     <%= f.select :pay_type, PaymentType::PAYMENT_TYPES,
29:                      :prompt => 'Select a payment method' %>
30:   </div>
31:   <div class="actions">

そのため、Ordersで:pay_typeを選択しようとしましたが、PaymentTypesで:pay_typeからオプションを指定しました。

私はそれが重要だとは想像できませんか?私の問題がどこにあるようですが、確かではありません。

4

1 に答える 1

0

検証インクルードの構文が間違っていると思います。次のようになります。

:pay_type、:inclusion => {:in=>PAYMENT_TYPES}を検証します

于 2012-11-14T18:49:24.200 に答える