如何使用Rails验证白名单特定短语(如"Learn Ruby")?
解决Rails中Subject字段的白名单验证问题
你的问题出在错误地把inclusion选项用在了validates_presence_of方法上——这个方法只负责验证字段是否非空,并不支持inclusion这类额外的验证规则,所以不管你怎么调整数组的写法,验证逻辑都不会生效。
这里给你两种正确的实现方式:
方式一:用validates同时验证存在性和白名单
这种方式更简洁,把两个验证规则合并到一个validates调用里:
validates :subject, presence: { message: "Please enter a subject" }, inclusion: { in: ['Learn Ruby', 'Learn Ruby on Rails'], message: "Please select a valid Subject" }
方式二:分开写独立的验证规则
如果你更喜欢拆分逻辑,可以分别调用专门的验证方法:
# 验证字段非空 validates_presence_of :subject, message: "Please enter a subject" # 验证字段值在白名单内 validates_inclusion_of :subject, in: ['Learn Ruby', 'Learn Ruby on Rails'], message: "Please select a valid Subject"
额外提示
- 关于你之前尝试的
%w()写法:%w( 'Learn Ruby' 'Learn Ruby on Rails')会按空格分割字符串,最终得到的数组是["'Learn", "Ruby'", "'Learn", "Ruby", "on", "Rails'"],这完全不是你想要的白名单内容。如果一定要用百分比字符串写法,应该用%W()(注意大写W),但直接写数组['Learn Ruby', ...]是最清晰的。 - 如果需要忽略大小写匹配(比如用户输入
learn ruby也能通过验证),可以给inclusion选项加上case_sensitive: false:
inclusion: { in: ['Learn Ruby', 'Learn Ruby on Rails'], message: "Please select a valid Subject", case_sensitive: false }
内容的提问来源于stack exchange,提问作者user3763682
相关产品推荐
相关产品推荐

