ここでの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_type
has_many line_items
belongs_to
ちなみに、hide_checkout_button
注文ページを表示しているときに、インスタンス変数を使用しようとしています。
Ordersテーブルにはテーブルへの外部キーがあり、ユーザーが送信したこのテーブルPaymentTypes
から正しいIDを見つけようとしています。PaymentTypes
payment_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からオプションを指定しました。
私はそれが重要だとは想像できませんか?私の問題がどこにあるようですが、確かではありません。