0

我有一个带有用户模型、信用卡模型和付款模型的 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

您肯定希望在您的模型中进行此验证。通常认为 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 回答
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 回答