Как сохранить пользовательские константы в Rails 4?

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

#config/initializers/regexps.rb
REGEXP_EMAIL = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
REGEXP_BITMESSAGE = /\ABM-[a-zA-Z1-9&&[^OIl]]{32,34}\z/

и используйте его как

if @user.contact =~ REGEXP_EMAIL
elsif @user.contact =~ REGEXP_BITMESSAGE

Это хорошая практика? Каков наилучший способ их хранения?

Ответ 1

Имеет смысл, что один из возможных подходов. Единственным недостатком этого подхода является то, что константы будут загрязнять глобальное пространство имен.

Подходом, который я обычно предпочитаю, является определение их внутри пространства имен приложений.

Предполагая, что ваше приложение называется Fooapp, у вас уже есть модуль Fooapp, определенный Rails (см. config/application).

Обычно я создаю файл fooapp.rb внутри lib, как показано ниже

module Fooapp
end

и я отбрасываю константы внутри. Также убедитесь, что он находится внизу файла application.rb

require 'fooapp'

Lazy-загрузка файла не будет работать в этом случае, поскольку модуль Fooapp уже определен.

Когда число констант становится достаточно большим, вы можете добавить их в отдельный файл, например /lib/fooapp/constants.rb. Этот последний шаг - просто тривиальное улучшение для группировки всех констант в одно простое место (я часто использую константы для замены магических чисел или для оптимизации, несмотря на Ruby 2.1., вероятно, позволит мне удалить несколько констант).

Еще одна вещь. В вашем случае, если регулярное выражение относится к одной модели, вы можете сохранить его внутри самой модели и создать модельный метод

class User

  REGEXP_EMAIL = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
  REGEXP_BITMESSAGE = /\ABM-[123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]{32,34}\z/

  def contact_is_email?
    contact =~ REGEXP_EMAIL
  end

end