2013-03-26 2 views
1

사용자에게 속하는 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 

이 레일에서이 작업을 수행하는 가장 좋은 방법이 있나요?

답변

0

저는 일반적으로 이것은 매우 좋은 방법이라고 생각합니다.

그러나 언급 할만한 몇 가지 사항이 있습니다.

일반적으로 특정 특성에 오류를 추가 할 때 해당 특성을 포함하지 않는 문장 단편으로 수행됩니다. 그 이유는 full_messages 도우미가 속성 이름을 오류와 연결하기 때문입니다. 이 경우 전체 메시지는 '지불 방법이 카드는 귀하의 것이 아닙니다'입니다. 나는 "당신에게 속한 것이 아닙니다"라는 메시지를 변경하여 "지불 방법이 당신에게 속하지 않습니다"라는 결과를 제안합니다. 그들이이 메시지를 얻는다면, 아마도 그들이 그것을 얻는 이유를 알 것입니다 ... 메시지를 줄이기위한 대안은 기본 오류에 전체 오류를 추가하는 것이지만, field_with_errors 항목이보기에서 작동하지 않게됩니다.

둘째, 메서드에서 두 개의 self.을 제거 할 수 있습니다. 불필요합니다.

마지막으로, 이것은 내 의견으로는이 유형의 유효성 검사를위한 완벽한 논리이며, 더 복잡한 것이면 custom validator을 보증합니다.

편집 :

이 시도 :

validates :payment_method, inclusion: { in: lambda{ |x| x.user.payment_methods } } 
+0

감사합니다. 나는 이것이 최선의 방법일지도 모른다고 걱정했지만 레일이 이것을하기위한 어떤 방법을 제공하기를 바랬다. 각 매개 변수를 검사하여 사용자가 무언가를 전달하려고 시도하지 않았는지 확인하는 메소드를 작성하지 않아도됩니다. – ajaxon

+0

사실, 거기에 ... 편집을 시도하십시오. 어쩌면 ... –

관련 문제