haml / javascript / erb escape - PullRequest
       30

haml / javascript / erb escape

3 голосов
/ 27 июня 2011

У меня странная ситуация, но вот она:

# a HAML file
:javascript
  #{ if session[:view].blank?
        "$.ajax({
            url: 'url_for params.merge(:action => 'index')',
            dataType: 'script'})"
    else
        "$.ajax({
            url: 'url_for companies_url',
            dataType: 'script'})"
    end }

Так что это в основном вложение javascript внутри ruby, внутри javascript, внутри HAML.Это не работает, потому что у меня неправильное вложение цитат.

  1. Я думаю, есть лучший способ сделать это.Есть мысли?
  2. Аякс, происходящий выше, визуализирует некоторые частичные элементы в текущем представлении и изменяет переменную сеанса .Как я могу обновить этот javascript, чтобы он вел себя правильно, учитывая новый сеанс [: view]?

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

Используйте ERB и вспомогательный метод. Это намного чище:

# foo_helper.rb (or whichever helper is applicable for this view)
module FooHelper
  def url_for_ajax_call
    if session[:view].blank?
      url_for(params.merge(:action => 'index'))
    else
      # url_for(companies_url) is redundant
      companies_url
    end
  end
end

# view.js.erb
$.ajax({ url: <%= url_for_ajax_call %>, dataType: 'script' })
2 голосов
/ 27 июня 2011

На мой взгляд, вам не нужно переключаться на ERB, но вспомогательный метод хорош. Я бы поместил URL в тег, который отображает страница. Обычно я делаю это в атрибуте data-href тега привязки для ненавязчивого JavaScript. Например:

= link_to "Link to index view", url_for(params.merge(:action => "index")), { 'data-href' => url_for_ajax_call }

Тогда:

$.ajax({ url: $(element).data('href'), dataType: 'script' })

Тогда все, что вам нужно сделать, это повторно отрендерить link_to, который восстановит правильный url_for_ajax_call.

Очевидно, что этот способ немного сложнее, так как вам нужно будет добавить обработчик события click к ссылке, и вам нужно будет остановить фактическое нажатие ссылки (http://api.jquery.com/event.preventDefault/). Но нет необходимости переключаться на ERB для одного файла, вы можете обрабатывать пользователей, которые отключают JavaScript, и это решит ваш второй вопрос.

1 голос
/ 16 мая 2018

Лучший способ, с помощью которого я смогу сделать подобные вещи, - написать javascript в виде текста внутри блока% script. Таким образом, ваш код станет:

# a HAML file
%script
  -if session[:view].blank?
    $.ajax({url: 'url_for params.merge(:action => 'index')',dataType: 'script'})
      -else
    $.ajax({url: 'url_for companies_url', dataType: 'script'})

в качестве бонуса вы можете даже сделать рубиновую интерполяцию сейчас:

# a HAML file
%script
  alert("#{ruby_variable}")
...