Есть ли более простой способ записать это и предотвратить дублирование кода?

Я использую посредника (Ruby on Rails) с HAML.

У меня есть такой код в начале каждой страницы:

- if pageversion == "test"
   - domain = data.testvars.domain
   - action_url = data.testvars.openlocker_url
   - lockergroup = data.testvars.lockergroup

- else
  - domain = data.prdvars.domain
  - action_url = data.prdvars.openlocker_url
  - lockergroup = data.prdvars.lockergroup

но я хочу знать, можно ли сделать что-то вроде этого:

домен = data.#{pageversion}vars.domain ...

поэтому каждый раз, когда он анализирует #{pageversion} и использует выходные данные для создания data.testvars.domain или data.prdvars.domain.

Поэтому я хотел бы либо указать, какой файл .yml использовать на основе #{pageversion}, либо интерпретировать указанную ранее строку как часть имени переменной для поиска в правильном файле.

есть идеи как это сделать?

Мой текущий способ сделать это включает в себя много дублированного кода, и попытка сделать это любым другим способом привела только к ошибкам.

🤔 А знаете ли вы, что...
Фреймворк обеспечивает возможность интеграции с различными фронтенд-технологиями и библиотеками, включая JavaScript и CSS.


76
2

Ответы:

Решено

Вам необходимо заранее назначить правильный, прежде чем использовать его:

data_vars = pageversion == "test" ? data.testvars : data.prdvars

Затем вы можете использовать присвоенное значение без дублирующего кода:

domain = data_vars.domain
action_url = data_vars.openlocker_url
lockergroup = data_vars.lockergroup

«Я хочу знать, можно ли сделать что-то вроде этого:» domain = data.#{pageversion}vars.domain.

Вы также можете использовать Object#public_send для достижения этой цели, предполагая, что pageversion == 'test' или pageversion == 'pdr'.

Пример:

domain = data.public_send("#{pageversion}vars").domain
action_url = data.public_send("#{pageversion}vars").openlocker_url
lockergroup = data.public_send("#{pageversion}vars").lockergroup

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

data_set = data.public_send("#{pageversion}vars") if data.respond_to?("#{pageversion}vars")