在我正在构建的当前应用程序中,我有一个textarea,用户将在其中输入以逗号分隔的电子邮件地址列表。
我目前正在将列表拆分为数组,然后逐个保存。但是,如果,我有这个意见......
blah@example.com,test @ example,foo @ example.com
...然后将保存blah@example.com,但保存测试@示例将失败。因此,当我显示test @ example不是有效电子邮件地址的错误时,我需要从逗号分隔的值字符串中删除blah@example.com,并将其传递回textarea。
有没有更好的方法在服务器端验证这些并处理错误而不会在控制器中获得幻想/丑陋?
提前致谢!
答案 0 :(得分:3)
假设这是一个包含大量电子邮件的模型,并且电子邮件模型使用:validate_email,您可以执行以下操作:
class Foo < ActiveRecord::Base
validate :must_not_have_invalid_addresses
...
def emails=(addresses)
@invalid_addresses = []
addresses.split(",").each do |address|
@invalid_addresses.push(address) unless emails.create({:address => address})
end
end
def must_not_have_invalid_addresses
errors.add_to_base("Some email addresses were invalid") unless @invalid_addresses.empty?
end
end
这会提供验证错误+无效电子邮件地址的数组,您可以根据需要访问这些地址。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以将保存电子邮件放入交易中。然后,如果任何保存失败,则取消所有预设保存。在这种情况下,只能在模型层上进行验证。
我认为这将是明确的代码,但肯定它不是最快的方式(但使用Ruby意味着你没有以更快的方式做到这一点;)
答案 3 :(得分:-1)
如果你将它们放在一个名为emails
的变量中,那么这样的事情可能会起作用:
if valid_emails?(emails)
# then have your normal logic here
if @user.save
flash[:notice] .....
end
end
private
def valid_emails?(emails)
not emails.find {|email| email =~ /[\w\.%\+\-]+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil?
end
编辑:实际上你可能只想使用这个正则表达式。它取自restful-authentication插件。