Как я могу безопасно хранить ruby ha sh в Rails? - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно сопоставить с разными логами c на основе уникального параметра id. По сути, я хочу сделать следующее:

{
  'id123' => send(:foo),
  'id789' => send(:bar)
}

Я бы не хотел жестко кодировать переменные, а хранение каждого идентификатора в отдельной переменной окружения утомительно и сложно отслеживать. Лучшее решение, которое я могу придумать, - это преобразовать ha sh в строку для хранения как env var, а затем преобразовать обратно в ha sh, когда я инициализирую приложение, но мне интересно, есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Не уверен, правильно ли я понял ваш вопрос, но для вашего собственного решения по преобразованию ha sh вы можете использовать Object Marshaling в Ruby для сериализации любого объекта (например, Ha sh). Это то, что делают некоторые библиотеки, такие как Sidekiq, и хранят сериализованный объект, например, в Redis.

class Demo
  def initialize(name)
    @name = name
  end
  def to_s
    p "Serializing #{@name}"
  end
end

obj = Demo.new("something...")
obj_d = Marshal.dump(o)
obj2 = Marshal.load(obj_d)
obj2.to_s

И вы всегда можете использовать eval для динамической оценки выражения: eval("obj2.to_s").

0 голосов
/ 19 июня 2020

Вы можете использовать пользовательскую конфигурацию Rails с Rails::Application.config_for:

# config/id_to_method_mapping.yml:
id123: "foo"
id789: "bar"
# config/application.rb
module MyApp
  class Application < Rails::Application
    config.id_to_method_mapping = config_for(:id_to_method_mapping)
  end
end
# your controller
method_name = Rails.configuration.id_to_method_mapping[params[:id]]
send(method_name)

Вы можете .gitignore конфигурационный файл, если вы не хотите, чтобы он быть в базе кода.

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