我有一个Rails 3程序,其中包含User模型,CreditCard模型,然后是Payment模型。用户has_many CreditCards,CreditCard has_many付款。
在我的申请中,当用户进行新的付款时,他从他的卡片列表中选择他想用来支付的CreditCard。我想在代码中添加额外的验证,以确保提交给Payment.create()函数的credit_card_id实际上是当前用户拥有的。
感觉就好像必须在控制器中进行验证,对吧?或者是否有处理这种情况的最佳做法?
答案 0 :(得分: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
答案 1 :(得分:0)
您肯定希望在模型中进行此验证。它通常被认为是Rails的最佳实践,可以保留您的controllers skinny并拥有胖模型。
假设付款属于某个用户并且付款属于信用卡(我假设这是因为您的付款上有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
答案 2 :(得分:0)
您还可以在PaymentsController
中获取[在过滤器前]中的信用卡@credit_card = current_user.credit_cards.find(params [:credit_card_id])
然后
@payment = @ credit_card.payments.build(params [:payment])
这样你就可以确定它是current_user拥有的credit_card。