我正在使用Ruby on Rails 3,我试图从SQL数据库中获取一个正则表达式字符串,以便稍后在验证方法中使用。
在数据库迁移中,我有:
create_table :profile_authorizations do |t|
t.string :param
t.string :param_value
end
在我的模型中:
class User < ActiveRecord::Base
email_regex = Parameter.find_by_param('regex').param_value
validates :email,
:format => { :with => email_regex }
end
在数据库中,我以这种方式为电子邮件创建正则表达式:
Parameter.create(:param => 'regex', :param_value => '/\A[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}\z/i')
使用该代码我收到此错误:
ArgumentError
A regular expression must be supplied as the :with option of the configuration hash
我也尝试使用这些
Parameter.find_by_param('regex').param_value.to_s
Parameter.find_by_param('regex').param_value.to_i
但它不起作用。
有什么不对?
此代码
@email_regex = Parameter.find_by_param('regex').param_value
<%= debug @email_regex %>
将导致此输出
--- /\A[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}\z/i
我试过这个:
Regexp.new(Parameter.find_by_param('regex').param_value)
它似乎不会产生错误,但验证“:with =&gt; email_regex”无法识别正则表达式。
在这种情况下,调试结果为
--- !ruby/regexp /\/\A[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}\z\/i/
答案 0 :(得分:0)
试试这个:
class User < ActiveRecord::Base
def self.email_regex
@@email_regex ||= Regexp.new(Parameter.find_by_param('regex').param_value)
end
validates :email, :format => { :with => User.email_regex }
end
另外,为什么你需要将验证正则表达式存储在数据库中,如果只在用户类加载时获取它,即在服务器启动时?可能是我错了,但你应该使用自定义验证器,如果你想让它从数据库中获取新的正则表达式值,但你应该在做之前三思而后行,因为你不太可能在这里有如此迅速的刷新价值
答案 1 :(得分:0)
找到解决方案(阅读Regex.new指南):
在数据库中,你必须把正则表达式放在没有'/'或'\ A'(在开头)和'\ z'(在结尾):
[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}
使用它你可以这样做:
Regexp.new(Parameter.find_by_param('regex').param_value)