Interpolate ruby ​​if statement в блоке javascript haml

Это код, который у меня есть:

:javascript
    // do something
- if current_user.role? :client
    :javascript
        //do something else

Это явно не очень чисто, так как я повторяю: javascript haml filter. Я бы хотел этого избежать, но я не знаю, как правильно написать инструкцию Ruby "if" внутри блока HAML: javascript.

Я знаю, как интерполировать переменные С# {}, но как вы делаете то же самое для целых if/for/etc. заявления?

Ответ 1

Я не пробовал, но я думаю, что вы могли бы сделать

:javascript
    // do something
- if current_user.role? :client
    ="//do something else"

(Как во втором примере здесь.)

Для очень короткого фрагмента javascript вы также можете попробовать

:javascript
    // do something
    #{current_user.role? :client ? "//do something else" : ""}

Ответ 2

Я делаю это:

if(#{params[:param_to_check_for].blank? ? "true" : "false"})

В приведенном выше случае условие params[:param_to_check_for].blank?.

Он отображает JavaScript как: if(false) или if(true)

Ответ 3

Я интерполировал переменную Ruby/HAML в явный JS true или false для условия JS следующим образом:

$("#cancel").click( function() {
  if (#{ !!my_flag_variable })
    window.location.href = "./";
  else
    $("#dialog").hide();
} );

Ответ 4

Я выполнил это с помощью вызова = yield :foot_scripts в моем макете, а затем:

= if condition
  - content_for :foot_scripts do
    - render :partial => "page_specific_javascript"  

в моих представлениях - таким образом я могу обеспечить, чтобы Javascript выполнялся именно там, где я хочу, чтобы он находился в DOM (ПОСЛЕ всего остального) и поддерживал его в отдельном файле, который намного чище. Извлеките script из ваших файлов просмотра? ХОРОШО!

Ответ 5

Это очень правильно.

Другой вариант - вы можете поместить его в части .js.erb и сделать рендеринг из представления haml.

Тогда вы можете просто сделать

// do something
<% if condition == true %>
  // do something else
<% end %>