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.

Другие вопросы по тегам