2013-03-14 6 views
0

У меня есть программа Rails 3 с моделью пользователя, модель CreditCard, а затем модель оплаты. Пользователь has_many CreditCards, а кредитная карта имеет платежные платежи.Rails 3 - Проверка ассоциации в контроллере?

В моей заявке, когда Пользователь совершает новый платеж, он выбирает из списка своих карт, которые CreditCard он хотел бы использовать для оплаты. Я хотел бы добавить дополнительную проверку в код, однако, чтобы убедиться, что функция credit_card_id, представленная функции Payment.create(), фактически принадлежит принадлежащей текущему пользователю.

Кажется, что проверка должна была бы произойти в контроллере, не так ли? Или есть лучшая практика для решения этого сценария?

ответ

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 
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 
0

вы также можете принести кредитной карты, как это [в перед фильтром] в PaymentsController

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

, а затем

@payment = @ credit_card.payments.build (PARAMS [: оплата])

Таким образом, вы будете уверены, что она CREDIT_CARD принадлежит CURRENT_USER ,

Смежные вопросы