Методы Ruby в Javascript в HAML - PullRequest
       14

Методы Ruby в Javascript в HAML

57 голосов
/ 15 апреля 2010

У меня есть скрипт jQuery, который добавляет новое поле в форму, и это поле содержит динамическую информацию из массива. Проблема в том, что я не могу понять, как добавить array.each, чтобы заполнить параметры поля выбора в JavaScript, не нарушая отступ HAML и не вызывая ошибок.

Вот моя лучшая попытка, которая не работает:

%script(type="text/javascript")  
  $('#mylink').click(function() {  
  $('#mylink').after('<select>  
  - myarray.each do |options|  
     <option value="#{options.id}">#{options.name}</option>  
  </select>);  
  )};

Также попробовал это с фильтром: javascript, но безуспешно.

Ответы [ 2 ]

102 голосов
/ 15 апреля 2010

Обычно, если что-то вызывает боль в хамле, это означает, что вы должны рефакторинг хитрого бита вспомогательному или частичному и вызывать его.

// some_helper.rb
def new_snazzy_select_tag(options = [])
  select_tag 'tag_name_here', options.map { |option| [option.id, option.name] }
end

Кроме того, вы должны использовать фильтр :javascript для рендеринга javascript, так как он поместит его в тег script и разрешит отступ.

Наконец, вы можете использовать #{ruby_expression} в любом месте haml, включая :javascript фильтры, что очень удобно, когда вам нужно вывести результат выражений ruby ​​в места, которые не являются непосредственно содержимым элементов html.

// some_view.html.haml
:javascript
  $('#mylink').click(function() {  
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}");
  };
8 голосов
/ 15 апреля 2010

Попробуйте, это должно сработать (все, что я сделал, это удалил один пробел в пятой строке и добавил заключительную цитату в шестую):

%script(type="text/javascript")
  $('#mylink').click(function() {
  $('#mylink').after('<select>
  - @myarray.each do |options|
    <option value="#{options.id}">#{options.name}</option>
  </select>');
  )};

Однако, если вы запускаете это с помощью сценария ruby ​​или своего рода фреймворком, почему бы просто не сделать это вне шаблона? Это, вероятно, будет наиболее подходящим. В rails / sinatra и других инфраструктурах вы можете использовать вспомогательный метод для этого. Если вы посмотрите на ссылку на хамл, они на самом деле не рекомендуют использовать - для оценки ruby.

...