Подтвердить что ты не робот

Включая встроенный javascript, используя content_for в рельсах

Я использую content_for и yeild для вставки файлов javascript в нижнюю часть моего макета, но мне интересно, что лучше всего для включения встроенного javascript. В частности, мне интересно, куда положить объявление типа script:

<% content_for :javascript do %> 
  <script type="text/javascript"> ... </script>
<% end %>

или

<% content_for :javascript do %> ... <% end %>
  <script type="text/javascript">
    <%= yield :javascript %>
  </script>
<% end %>

Я использую первый вариант сейчас и задаюсь вопросом, плохо ли включать несколько

 ...

в одном представлении. Иногда у меня есть части, которые приводят к этому.

4b9b3361

Ответ 1

Я предпочитаю, чтобы выход макета выглядел следующим образом:

<html>
  <!-- other stuff -->
  <body>
   <!-- other stuff  -->
   <%= yield :javascript %>
  </body>
</html>

Затем в представлении вы можете написать:

<% content_for :javascript do %>
  <script type='text/javascript'>
    function doMagic() {
      //Mind-blowing awesome code here
    }
  </script>

<% end %>

<!-- More view Code -->

<%= render :partial => "sub_view_with_javascript" %>

И в частичном _sub_view_with_javascript.html.erb вы также можете написать:

<% content_for :javascript do %>
  <script type='test/javascript'>
     function DoMoreMaths() {
       return 3+3;
     }
   </script>
<% end %>

Мое рассуждение о таком подходе заключается в том, что доходность и content_for находятся в разных файлах. Это не DRY, чтобы поместить тег script для каждого content_for , но он позволяет синтаксическому маркеру распознавать изменение языка в каждом файле и помогает мне там.

Если у вас несколько запросов content_for в одном файле к одному и тому же символу (в нашем случае: javascript), я бы рассмотрел возможность объединения всех их в верхний, но он идеально подходит для использования с частицами.

И HTML отлично подходит для размещения как можно большего количества блоков script. Единственная возможная проблема заключается в том, что при работе с кодом в инструментах разработчика, таких как firebug, требуется немного больше времени, чтобы найти правильный блок script для вашей функции. Это происходит только для меня, когда мне нужно установить контрольную точку javascript для отладки.

Ответ 2

Здесь решение, если вы действительно хотите сохранить число <script> тег минимальный в вашем html и по-прежнему может иметь ваш IDE выделить javascript. Это действительно полезно с jquery, если вам нужен только один вызов $(document).ready() в вашем html или с facebook js api для вызова js при загрузке api и т.д.

layout_helper.rb:

  def javascript_jquery_ready(script)
    content_for(:javascript_jquery_ready) {
      script .gsub(/(<script>|<\/script>)/, "")
    }
  end

application.html.erb:

<script>
    $(document).ready(function(){
        <%= yield(:javascript_jquery_ready) %>
    });
</script>

любой файл вида:

<% javascript_jquery_ready (capture do %>
  <script>
    $('#share_access_link').click(function(){
      $('#share_access_form').slideToggle();
    }); 
  </script>
<% end) %>

Это решение позволяет мне сохранить мой код в моей среде и его читабельность, поскольку мне не нужно создавать частичные для каждого js-кода. Даже если он ничего не изменит для конечного пользователя, результат html будет более чистым.