Запустите код ruby ​​с помощью eval и его драгоценных камней, рельсов - PullRequest
0 голосов
/ 03 мая 2018

Я использую eval для запуска некоторого кода (то есть в базе данных, нет рубиновых файлов), но этот код требует некоторых драгоценных камней. Как бы я запустил код? Может быть, есть лучший способ, чем Eval?

Чтобы дать немного больше контекста, у меня есть кнопка-переключатель в представлении, которая переключает логическое значение на true или false в модели. Это возможно для каждого «куска кода».

Когда он переключается в true, код начинает выполняться в потоке, который никогда не останавливается, а когда он переключается в false, это убивает поток.

Я просто пытаюсь заставить поток запустить код прямо сейчас.

Я довольно новичок в рельсах, так что, может быть, есть гораздо лучший способ, чем делать это вручную, как то, что я делаю, но я попытался погуглить некоторые типичные потоки, и они используются для отправки почты или других подобных вещей. Не для чего-то, что никогда не останавливается, если не сказано (т. Е. Переключить кнопку, которая переключает логическое значение на false).

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Чтобы запустить скрипт в среде rails, который звучит так, как вам нужно, вы можете использовать rails runner. Например. что-то вроде:

rails runner lib/scripts/my_script_to_run.rb 

Этот сценарий затем получит требуемый код из базы данных и уже будет иметь правильный контекст (rails) для возможности выполнения кода.

Или, может быть, даже более уместно:

rails runner <your-ruby-code-here> 

См. документация

Альтернативой является рассмотрение фоновых заданий, которые, кажется, лучше подходят для этой проблемы. Проверьте направляющие для ActiveJob: http://edgeguides.rubyonrails.org/active_job_basics.html

Преимущество использования фоновых заданий:

  • это проверенный способ работы
  • некоторые адаптеры включают дополнительные инструменты управления
  • вам не нужно самим управлять потоками
  • существует простой способ описания заданий в заданиях с кодом и очередями
  • Использование существующих концепций / решений также легче объяснить другим разработчикам

Существует множество доступных адаптеров, и некоторые из самых простых - просто сохранить задания в текущей базе данных. Полный список см. http://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters.html, Я бы рекомендовал начать с Que или DelayedJob. В этом случае ваш поток немного изменится: я поставлю работу в очередь, и вместо зацикливания я буду требовать, пока переключатель не переключен. Но, конечно: я не знаю вашего точного варианта использования, поэтому ваш подход может быть одинаково действительным или лучше.

0 голосов
/ 03 мая 2018

Похоже, вам нужен код с префиксом импорта гемов - что, вероятно, требует среды упаковщика для загрузки этих драгоценных камней.

Поскольку код хранится непосредственно в базе данных, вы можете добавить к ним префикс в виде другого столбца / константы, который выполняет всю загрузку гемов.

Если гемы уже установлены через упаковщик на сервере, попробуйте префикс вашего кода с bundle exec. Для этого вам нужно сначала написать код во временную папку.

Чтобы установить правильные гемы, это часть ваших процессов сборки / развертывания.

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