Включение встроенного JavaScript с использованием content_for в рельсах - PullRequest
18 голосов
/ 17 марта 2010

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

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

или

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

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

...

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

Ответы [ 2 ]

30 голосов
/ 17 марта 2010

Я бы предпочел, чтобы выход макета выглядел так:

<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 %>

Мое обоснование этого подхода заключается в том, что yield и content_for находятся в разных файлах. Не СУЩЕСТВЕННО вставлять тег script для каждого content_for , но он позволяет подсветке синтаксиса распознавать изменение языка в каждом файле и помогает мне в этом.

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

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

1 голос
/ 22 марта 2011

Вот решение, если вы действительно хотите, чтобы количество тегов было минимальным в вашем 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) %>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...