情况:
我有一个用户模型,需要通过列入黑名单的电子邮件地址进行验证。列入黑名单的电子邮件地址位于名为黑名单
的额外模型中 class User < ActiveRecord::Base
validate :email_is_not_blacklisted
def email_is_not_blacklisted
@blacklist = Blacklist.where(:blacklist_type => "E-Mail")
@blacklist.each do |item|
errors.add(:email, 'is blacklisted') if self.email.match(item)
end
end
end
class Blacklist < ActiveRecord::Base
attr_accessible :name, :blacklist_type
#some validation code for blacklist items ...
end
#: name, blacklist_type
#1: 'demo-mail.com', 'E-Mail'
#2: 'test123.com', 'E-Mail'
黑名单模型也将用于禁止将来的特定用户名!
问题:
我的问题是 [at] blacklist 总是 nil 。也许我的逻辑出了问题?换句话说:是否可以在没有相应的情况下访问另一个模型中的模型?
感谢您的帮助,并为现有的语言错误道歉。我不是母语为英语的人:)
解<!/强> 我错过了定义项目的哪个属性应该使用...
errors.add(:email, 'is blacklisted') if self.email.match(item.name)
有时我的大脑不喜欢我喜欢的方式...
答案 0 :(得分:2)
我建议你使用这个
class User < ActiveRecord::Base
validate :email_is_not_blacklisted
def email_is_not_blacklisted
if Blacklist.find_by_blacklist_type_and_name("E-Mail",self.email)
errors.add(:email, 'is blacklsited')
end
end
end
这将比之前的更快
答案 1 :(得分:0)
区分大小写。您正在搜索blacklist-type =“E-Mail”,您的示例数据是“电子邮件”
答案 2 :(得分:0)
要扩展我的评论,请尝试以下方法:
class User < ActiveRecord::Base
validate :email_is_not_blacklisted
def email_is_not_blacklisted
Blacklist.find_all_by_blacklist_type("E-Mail").each do |item|
errors.add(:email, 'is blacklsited') if.self.email.match(item)
end
end
end