Обрабатывать регулярное выражение, получая его значение из базы данных - PullRequest
0 голосов
/ 30 января 2011

Я использую 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 => email_regex" не распознает регулярное выражение.

В этом случае отладка приводит к

--- !ruby/regexp /\/\A[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}\z\/i/

Ответы [ 2 ]

0 голосов
/ 30 января 2011

Нашли решение (читая руководство 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)
0 голосов
/ 30 января 2011

попробуйте это:

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

также, зачем вам нужно хранить регулярное выражение проверки в базе данных, если вы получаете его только при загрузке класса пользователя, то есть при запуске сервера?Может быть, я ошибаюсь, но вы должны использовать собственный Validator, если вы хотите, чтобы он извлекал свежее значение регулярного выражения из БД, но вам следует дважды подумать, прежде чем делать это, потому что вы вряд ли будете иметь столь быстрое обновление значения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...