1

Userに属するPaymentMethodsというモデルがあります。ユーザーがチェックアウトに行くと、ユーザーに属する利用可能なPaymentMethodのリストが表示されます。ユーザーが手動でdomを編集したり、他の人の支払い方法を使用したりできないようにするための最良の方法は何ですか?

現在、モデルでカスタム検証を使用しています

def payment_method_owner?

  errors.add(:payment_method, "This card doesn't belong to you") unless self.user.payment_methods.include? self.payment_method

end

これはRailsでこれを行うための最良の方法ですか?

4

1 に答える 1

0

一般的に、これはかなり良い方法だと思います。

ただし、言及する価値のある点がいくつかあります。

通常、特定の属性にエラーを追加する場合、件名を含まない文の断片を使用して行われます。これは、full_messagesヘルパーが属性名をエラーと連結するためです。この場合、完全なメッセージは「支払い方法このカードはあなたのものではありません」になります。メッセージを「あなたのものではありません」に変更して、「支払い方法はあなたのものではありません」という結果にすることをお勧めします。彼らがこのメッセージを受け取っている場合、彼らはおそらくそれを受け取っている理由を知っています...メッセージを短くする代わりに、ベースに完全なエラーを追加することもできますが、これにより、field_with_errorsのものがビューで機能しなくなります。

次に、メソッド内の2つを削除できself.ます。これらは不要です。

最後に、私の意見では、これはこのタイプの検証に最適な量のロジックであり、より複雑なものはおそらくカスタムバリデーターを必要とします。

編集:

これを試して:

validates :payment_method, inclusion: { in: lambda{ |x| x.user.payment_methods } } 
于 2013-03-26T23:19:06.793 に答える