У меня есть сценарий 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 без удачи.
Обычно, если что-то вызывает трудности в haml, это означает, что вам следует рефакторить сложный бит в помощника или частичный и вызывать его.
// 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)}");
};
Попробуйте это, это должно сработать (все, что я сделал, это удалил один пробел в пятой строке и добавил заключительную цитату в шестой):
%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 и других фреймворках для этого можно использовать вспомогательный метод. Если вы посмотрите на ссылки на haml, они фактически не рекомендуют использовать -
для оценки ruby.