我有一个带有用户模型、信用卡模型和付款模型的 Rails 3 程序。User has_many CreditCards,CreditCard has_many Payments。
在我的应用程序中,当用户进行新付款时,他会从他的卡列表中选择他想用来支付的信用卡。我想在代码中添加一个额外的验证,以确保提交给 Payment.create() 函数的 credit_card_id 实际上是当前用户拥有的。
感觉验证必须在控制器中进行,对吧?或者是否有处理这种情况的最佳实践?
我有一个带有用户模型、信用卡模型和付款模型的 Rails 3 程序。User has_many CreditCards,CreditCard has_many Payments。
在我的应用程序中,当用户进行新付款时,他会从他的卡列表中选择他想用来支付的信用卡。我想在代码中添加一个额外的验证,以确保提交给 Payment.create() 函数的 credit_card_id 实际上是当前用户拥有的。
感觉验证必须在控制器中进行,对吧?或者是否有处理这种情况的最佳实践?
添加付款验证。付款很可能与用户相关联,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
您肯定希望在您的模型中进行此验证。通常认为 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
您还可以在 PaymentsController 中获取这样的信用卡 [在之前的过滤器中]
@credit_card = current_user.credit_cards.find(params[:credit_card_id])
进而
@payment = @credit_card.payments.build(params[:payment])
这样您就可以确定它是 current_user 拥有的 credit_card。