我有一个名为PaymentMethods的模型属于User。当用户去结账时,他们会看到属于他们的可用PaymentMethods列表。确保用户无法手动编辑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中执行此操作的最佳方式吗?
答案 0 :(得分:0)
我认为,一般来说,这是一个很好的方式。
然而,有几点可能值得一提。
通常,在向特定属性添加错误时,会使用不包含主题的句子片段来完成。原因是因为full_messages帮助器将属性名称与错误连接起来。在这种情况下,完整的消息将是“付款方式此卡不属于您”。我建议将邮件更改为“不属于您”,导致“付款方式不属于您”。如果他们收到此消息,他们可能知道他们为什么会得到它...缩短消息的另一种方法是将完整错误添加到base,但这会使field_with_errors内容在视图中不起作用。
其次,您可以删除方法中的两个self.
,它们是不必要的。
最后,在我看来,对于这种类型的验证来说,这是完美的逻辑量,任何更复杂的东西都可能需要custom validator。
修改强>
试试这个:
validates :payment_method, inclusion: { in: lambda{ |x| x.user.payment_methods } }