L oop JSON объекты в Ruby на рельсах - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь понять, как отображать пользовательские HTML объекты, созданные пользователями. Например, пользователь может создать кнопку (кнопки) с настраиваемым стилем со следующими свойствами: color, font-size и border-radius. Вот пример моего json:

    [
      {
        id: 2,
        configs: {
          color: "#000000",
          font_size: 10,
          border_radius: 0,
          display: true,
          button_1: [
            {
              color: "red",
              font_size: 12,
              border_radius: 4,
              display: true,
            }
          ],
        },
        created_at: "2020-05-07T21:42:04.808Z",
        updated_at: "2020-05-07T21:42:04.808Z",
      },
      {
        id: 3,
        configs: {
        color: "#000000",
        font_size: 10,
        border_radius: 0,
        display: true,
        button_1: [
          {
            color: "blue",
            font_size: 15,
            border_radius: 24,
          }
        ],
        button_2: [
          {
            color: "pink",
            border_radius: 2,
          }
        ],
      },
      created_at: "2020-05-07T22:29:31.255Z",
      updated_at: "2020-05-07T22:29:31.255Z",
    },
  ]

Я хочу отображать все кнопки в соответствии с настройками стиля пользователя. Пробовал что-то вроде:

%p #{btn.id}: #{btn[:configs][:button_1][0][:color][:font_size]}

Но не выглядит практичным. Кроме того, в некоторых случаях это может привести к ошибке:

undefined method `[]' for nil:NilClass

Я пробовал использовать гем вроде activerecord-typedstore , но похоже, что он не поддерживает вложенные атрибуты ( Есть ли способ освоить вложенный json со столбцом json? ). Есть ли способ отображать настраиваемые кнопки на основе критериев пользователя?

1 Ответ

2 голосов
/ 08 мая 2020

In Ruby "configs" и :configs не эквивалентны. Вы должны использовать тип, используемый в структуре.

Для навигации по сложным структурам JSON используйте dig:

btn.dig('configs', 'button_1', 0, 'color', 'font_size')

Вы также можете обозначить клавиши символами, если вы хотите использовать symbolize_keys:

btn.symbolize_keys!

Если вы предпочитаете символы и читаете JSON вручную, вы всегда можете запросить его с помощью символьных клавиш вне ворот, используя symbolize_names вариант до JSON.parse:

JSON.parse('{"test": true}')
# => {"test"=>true}
JSON.parse('{"test": true}', symbolize_names: true)
# => {:test=>true}
...