Подтвердить что ты не робот

Ruby внутри блока javascript [тонкий шаблон]

Есть ли способ включить условия ruby ​​в блок javascript? то есть.

javascript:
  var config = {
      common_value_1 : 1, 
      common_value_2 : 2 
  };
  - if my_value === true # this must be a ruby condition
    config.custom_true_value_1 = "1" ;
    config.custom_true_value_2 = "#{my_value}" ;
  - else
    config.custom_false_value_1 = "1" ;
    config.custom_false_value_2 = "#{my_value}" ;

Или есть ли другой способ решения этой проблемы? Потому что уродливый способ, которым я могу использовать его:

javascript:
    var config = {
      common_value_1 : 1, 
      common_value_2 : 2 
    };
- if my_value === true # this must be a ruby condition
  javascript:
    config.custom_true_value_1 = "1" ;
    config.custom_true_value_2 = "#{my_value}" ;
- else
  javascript:
    config.custom_false_value_1 = "1" ;
    config.custom_false_value_2 = "#{my_value}" ;

Но мне это не нравится, потому что если config имеет общие значения между if и else, то я бы дублировал свой код и был бы намного больше и тяжело поддерживать.

Обновлено с лучшими примерами

4b9b3361

Ответ 1

Вы можете использовать стиль, аналогичный строковой интерполяции. Пример ниже.

javascript:
  var config = { 
    custom: "#{my_value ? 'truthy' : 'falsy'}",
    current_user: #{raw current_user.to_json}
  };

** Обновить ниже **

Если вам нужна более сложная конфигурация, я бы рекомендовал создать класс, например

class ClientConfig
  attr_accessor :foo, :bar

  # .. code

  def to_json
    { foo: foo, bar: bar }.to_json
  end
end

# in view file
javascript: 
  var config = ClientConfig.new.to_json

Иначе у вас также есть возможность создать частичку ruby. Я создал пример ниже, который может быть не таким красивым, но я работаю.

# template_path/_config.html.ruby
def configuration
  { foo: "Hello", bar: "World" }
end

def july_special
  { june_key: "It June" }
end

def month_name
  Date.today.strftime("%B")
end

config = month_name == 'July' ? configuration.merge(july_special) : configuration

content_tag :script, config.to_json.html_safe

# viewfile
= render 'template_path/config'

Итак, я хочу сказать, что theres многократно используют это, и вы должны попытаться найти способ, которым больше всего подходит ваш и приложение. В моем случае я бы использовал свой первый пример (до обновления), если мне просто нужно одно или два значения else, я бы пошел за классом ClientConfig

Ответ 2

В чистом Slim у вас нет raw и html_safe. В этих случаях просто используйте двойные фигурные скобки, как описано здесь:

javascript:
  var data = #{{ JSON.dump([{x: 1, y:2}]) }};

Ответ 3

У вас есть 2 варианта:

1. Используйте раздел ruby

Этот сценарий лучше для сложного кода.

У меня есть объект ruby, который я хочу сделать JSON. Итак, внутри моего тонкого файла я создам раздел ruby:

ruby:

  myObject = @object.to_json.html_safe

Обратите внимание на html_safe: важно не избегать двойных кавычек.

Затем вы можете использовать myObject внутри javascript:

javascript:

  var data = #{myObject};

2. Используйте двойные фигурные скобки

Для простых случаев используйте двойные фигурные скобки внутри раздела javascript, как указано в ответе @fphilipe:

javascript:

  var data = #{{@object.to_json}};