处理正则表达式从数据库中获取其值

时间:2011-01-30 01:36:12

标签: ruby-on-rails ruby regex email ruby-on-rails-3

我正在使用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/

2 个答案:

答案 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)