Использование регулярного выражения, хранящихся внутри файла YAML


Я установил settingslogic и в файле конфигурации я поставил regex для электронной почты следующим образом:

#config/settings.yml
defaults: &defaults

  email_regex: /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i

development:
  <<: *defaults
  # neat_setting: 800

test:
  <<: *defaults

production:
  <<: *defaults

Что я загружаю в разработке конфигурации таким образом:

#config/initializers/devise.rb
  # Regex to use to validate the email address
  # config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
  config.email_regexp = eval Settings.email_regex

Это работает, но что вы думаете о том, что ивала? Это правильный способ, чтобы преобразовать строку в регулярное выражение?



20172
23
задан 22 января 2011 в 06:01 Источник Поделиться
Комментарии
3 ответа

Я не сумасшедший об использовании eval для такой простой задачи, это просто и это работает, но это просто не сидят хорошо со мной; это как дать свою "грань" машины с инди достать буханку хлеба. Вместо этого вы могли бы сделать что-то подобное.

split = Settings.email_regex.split("/")
options = (split[2].include?("x") ? Regexp::EXTENDED : 0) |
(split[2].include?("i") ? Regexp::IGNORECASE : 0) |
(split[2].include?("m") ? Regexp::MULTILINE : 0) unless split[2].nil?
Regexp.new(split[1], options)

Это будет работать, если есть варианты или нет и не требует потенциально опасных ивал.

П. С. Sinetris сделал намного лучше предложение просто добавить !Руби/регулярное выражение, прежде чем ваш regex и оборачивать ее в одинарные кавычки в настройках.файл YML. Это все еще не решить проблему с классом регулярного выражения не должным образом занимающихся строковое представление регулярного выражения высказываний, хотя, поэтому я оставлю код для тех, кто хочет сделать это за файл YML.

9
ответ дан 22 января 2011 в 07:01 Источник Поделиться

Я определенно не положить выражения в комментарии. Это значит, что ее нужно менять в двух местах, одно из которых не имеет значения, и будут вводить в заблуждение. Поместить комментарий на объявление email_regex , который объясняет, что это фильтрация. Таким образом, если он никогда не меняется, все местами поменять и легко найти.

#config/initializers/devise.rb
# Regex to use to validate the email address
config.email_regexp = eval Settings.email_regex

и

# Email validation regex - <short explanation to taste>
email_regex: /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i

Я не вижу никаких проблем читабельности кода, если это правильный способ получения настройки. (Я не эксперт Руби.)

6
ответ дан 22 января 2011 в 06:01 Источник Поделиться

Если вы хотите избежать ивала вы можете. Это немного больше трюк, но вы можете быть уверены, у вас есть регэкспы после этого кода в разработке :

#config/initializers/devise.rb
# Regex to use to validate the email addres
# config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
Setting.email_regexp[/\/(.*)\/(.?)/]
config.email_regexp = x ; Regexp.new(/#{$1}/)

Проблема с этот трюк вам не удалось второй аргумент в вашем случае неотзывчивый-чехол. Вам просто нужно добавить новый параметр, как :

email_regexp_sensitive_case: true

И теперь вам нужно просто позвонить такой :

#config/initializers/devise.rb
# Regex to use to validate the email addres
# config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
Setting.email_regexp[/\/(.*)\/(.?)/]
config.email_regexp = Regexp.new(/#{$1}/, Setting.email_regexp_sensitive_case)

В моем случае вы уверены, что есть регулярное выражение, определить в ваш email_regexp без какого-либо оценку.

4
ответ дан 23 января 2011 в 12:01 Источник Поделиться