Помогите мне с моей архитектурой - глобальные переменные в Ruby on Rails - PullRequest
0 голосов
/ 24 января 2011

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

Но я не нашел другого пути, чем глобальная переменная для того, что мне нужно. Может ли опытный программист Rails помочь мне?

То, что я хочу сделать, - это создать новый выделенный регистратор, например, войти в «log / audit.txt» и поделиться им между несколькими контроллерами. Конечно, я бы предпочел не создавать этот объект «logger» для каждого запроса.

Сейчас я создаю регистратор в глобальной переменной $ my_logger в инициализаторе и использую его на своих контроллерах.

Что ты думаешь? Есть ли лучший способ сделать это?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 января 2011

Общая позиция ОО против использования глобальных переменных и синглетонов любого типа - в Rails и во всех других средах ОО - заключается в том, чтобы избежать «скользкого спуска» в сторону отказа от проектирования ОО вообще. Глобальных переменных следует избегать в максимально возможной степени, но ваш регистратор, очевидно, является тем случаем, когда какой-то синглтон имеет смысл. Среда Rails является примером: у вас есть только среда Rails на приложение, иэто по сути синглтон.Или рассмотрите Notifier.deliver ...

Не беспокойтесь о том, где его разместить, если оно должно быть глобальным.Создайте объект Singleton с методами класса в качестве методов доступа и поместите его в lib или в любое место, где вы считаете нужным (например, создание плагина также может быть уместным).Тогда вы просто используете Logger.instance.log whatever.Конечно, вы должны будете принять меры предосторожности, чтобы убедиться, что объект создается только один раз.

1 голос
/ 24 января 2011

Этот вопрос очень важен: Как в Ruby on Rails сохранять объекты в памяти между сеансами

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

Однако мне нравится второй ответ ... цитата:

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

...

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

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

Создайте свой собственный класс логгера и потребуйте его при необходимости.

Пример здесь:

http://ianma.wordpress.com/2009/04/08/custom-logging-in-ruby-on-rails/

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