1

ユーザーが負荷を作成して入札できるアプリケーションがあります。

申し込みをしてクレジットカードを処理する入札を予約する方法が欲しいのですが、予約モデルの設定に問題があります。設定は次のとおりです。

関連付けのあるモデル:

class Reservation < ActiveRecord::Base
  belongs_to :load
  belongs_to :bid

  validates :load_id, presence: true
  validates :bid_id, presence: true
end

class Load < ActiveRecord::Base
  has_many :bids, :dependent => :delete_all
  has_one :reservation
end

class Bid < ActiveRecord::Base
  belongs_to :load
  has_one :reservation
end

予約の移行には、2つのテーブルへの参照のみが含まれます。予約コントローラーには、次のコードがあります。

class ReservationsController < ApplicationController

  before_filter :find_load
  before_filter :find_bid 

  def new
    @reservation = @load.build_reservation(params[:reservation])
  end

  def create
    @reservation = @load.build_reservation(params[:reservation].merge!(:bid_id => params[:bid_id])) 
    if @reservation.save
      flash[:notice] = "Reservation has been created successfully"
      redirect_to [@load, @bid]
    else
      render :new
    end
  end

  def find_load
    @load = Load.find(params[:load_id])
  end

  def find_bid
    @bid = Bid.find(params[:bid_id])
  end
end

私の設定ルートファイルには、次のものがあります。

resources :loads do 
  resources :bids do 
    resources :reservations
  end
end

予約モデルの移行は次のようになります。

def change
  create_table :reservations do |t|
    t.references :load
    t.references :bid
    t.timestamps
  end
end

ビューコード:

<h4>Reserve this bid: </h4>
  <dl>
    <dt>Carrier</dt>
    <dd><%= @bid.user.email %></dd>
    <dt>Bid Amount:</dt>
    <dd><%= @bid.bid_price %></dd>
 </dl>

<%= form_for [@load, @bid, @reservation], :html => {:class => 'payment_form'} do |f| %>
  <%= f.error_messages %>
<fieldset>
  <div class="field">
    <%= label_tag :card_number, "Credit Card Number" %>
    <%= text_field_tag :card_number, nil, name: nil %>
  </div>
  <div class="field">
    <%= label_tag :card_code, "Security Code on Back of Card (CVV)" %>
    <%= text_field_tag :card_code, nil, name: nil %>
  </div>
  <div class="field">
    <%= label_tag :card_month, "Card Expiration" %>
    <%= select_month nil, { add_month_numbers: true }, { name: nil, id: "card_month" } %>
    <%= select_year nil, { start_year: Date.today.year, end_year: Date.today.year+15 },
  { name: nil, id: "card_year" } %>
 </div>
</fieldset>

フォームを送信しようとすると、次の検証エラーが発生します:「入札を空白にすることはできません」。フォームがとして入札を送信しているようnilですが、なぜこれを行っているのかわかりません。コントローラーの作成アクションでコードの最初の行が正しいとは思わないので、考えられるすべての順列を試しましたが、機能させることができません。

4

1 に答える 1

1

フォームには保存するデータが含まれていないため、次のようにするだけで済みます。

@reservation = @load.build_reservation(:bid_id => @bid.id)

将来保存したい予約フィールドを追加すると、追加params[:reservation]されなくなりnil、次のことができるようになります。

@reservation = @load.build_reservation(params[:reservation].merge(:bid_id => @bid.id))

もう1つの方法は、を含むフォームに非表示フィールドを追加することbid_idですが、すでにURLに含まれているため、これは最善の方法ではない可能性があります。

于 2012-05-18T00:23:22.250 に答える