Rails 3 - 控制器中的关联验证?

时间:2013-03-14 00:14:48

标签: ruby-on-rails ruby-on-rails-3 associations

我有一个Rails 3程序,其中包含User模型,CreditCard模型,然后是Payment模型。用户has_many CreditCards,CreditCard has_many付款。

在我的申请中,当用户进行新的付款时,他从他的卡片列表中选择他想用来支付的CreditCard。我想在代码中添加额外的验证,以确保提交给Payment.create()函数的credit_card_id实际上是当前用户拥有的。

感觉就好像必须在控制器中进行验证,对吧?或者是否有处理这种情况的最佳做法?

3 个答案:

答案 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。