Rails 3 - проверка соответствия в контроллере?
У меня есть программа Rails 3 с моделью User, моделью CreditCard, а затем моделью Payment. Пользователь has_many CreditCards, а CreditCard has_many Payments.
В моем приложении, когда пользователь совершает новый платеж, он выбирает из списка своих карт, какую кредитную карту он хотел бы использовать для оплаты. Я хотел бы добавить дополнительную проверку в код, хотя, чтобы удостовериться, что credit_card_id, переданный в функцию Payment.create(), действительно принадлежит текущему пользователю.
Такое ощущение, что проверка должна проходить в контроллере, верно? Или есть лучшая практика для решения этого сценария?
3 ответа
Вы обязательно захотите сделать эту проверку в вашей модели. Обычно считается лучшей практикой 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
Добавить подтверждение оплаты. платеж, скорее всего, связан с пользователем через 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
Вы также можете получить кредитную карту, как это [в фильтре перед] в PaymentsController
@credit_card = current_user.credit_cards.find (params [: credit_card_id])
а потом
@payment = @credit_card.payments.build(params[:payment])
Таким образом, вы будете уверены, что это credit_card, принадлежащая current_user.