2013-07-22 3 views
22

Есть способ установить условия ruby ​​внутри блока javascript? то естьрубин внутри блока 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}" ; 

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

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

+0

Причина: если часть else присваивает одинаковые значения? Это нормально? –

+1

Тестирование против буквального истины - это странная вещь. Почему не '' если my_value' достаточно? – tadman

+0

Я просто не очень хорошо объясняю себя, посмотрю на обновленный вопрос, спасибо ... – norman784

ответ

26

Вы можете использовать стиль, похожий на струнно интерполировать. Пример ниже.

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 

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

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

def july_special 
    { june_key: "It's 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' 

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

+0

Что будет, если я хочу добавить разные ключи в каждом случае, я обновляю свой вопрос, кажется, что я не очень хорошо объясняю себя первым время – norman784

+0

Se обновленный ответ для некоторых альтернатив. – aross

+0

кажется справедливым для меня ... спасибо ... – norman784

12

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

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

Это самый простой и точный ответ. –

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}}; 
+1

Интересно, что так сложно найти в Интернете. Спасибо @rael. –

Смежные вопросы