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, то я бы дублировал свой код и был бы намного больше и тяжело поддерживать.
Обновлено с лучшими примерами
Ответы
Ответ 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}};