0

User モデル、CreditCard モデル、および Payment モデルを含む Rails 3 プログラムがあります。User has_many CreditCards、および CreditCard has_many Payments。

私のアプリケーションでは、ユーザーが新しい支払いを行うときに、支払いに使用するクレジットカードをカードのリストから選択します。Payment.create() 関数に送信された credit_card_id が実際に現在のユーザーが所有するものであることを確認するために、コードに追加の検証を追加したいと思います。

その検証はコントローラーで行う必要があるように感じますよね? または、このシナリオに対処するためのベスト プラクティスはありますか?

4

3 に答える 3

3

支払いの検証を追加します。支払いはおそらくユーザーに関連付けられているbelongs_toため、次の検証を追加することをお勧めします

# payment.rb
belongs_to :user
validate :validates_credit_card_belongs_to_user

private

def validates_credit_card_belongs_to_user
  unless user.credit_card.where(id: credit_card_id).exists?
    errors.add(:credit_card_id, 'is not owned by this user')
  end
end
于 2013-03-14T00:22:21.397 に答える
0

PaymentsController で [フィルタ前] のようにクレジット カードを取得することもできます。

@credit_card = current_user.credit_cards.find(params[:credit_card_id])

その後

@payment = @credit_card.payments.build(params[:payment])

そうすれば、current_user が所有する credit_card であることを確認できます。

于 2013-03-14T01:42:12.963 に答える
0

モデルでこの検証を行うことは間違いありません。通常、Rails のベスト プラクティスは、コントローラーをスリムに保ち、モデルをファットにすることです。

支払いがユーザーに属し、支払いがクレジットカードに属していると仮定すると(支払いに credit_card_id フィールドがあるため、これを想定しています)、次のようなことができます。

Class Payment < ActiveRecord::Base    
  belongs_to :user
  belongs_to :credit_card

  validate :credit_card_belongs_to_user

  def credit_card_belongs_to_user
    errors.add(:credit_card, 'does not belong to you') unless user == credit_card.user
  end
end 
于 2013-03-14T00:38:34.437 に答える