Как разделить библиотеки JavaScript и вызовы в конвейере ресурсов Rails 3.1 - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь освоить весь процесс создания активов и читаю руководство и несколько учебных пособий о них. Но одна вещь, которая не совсем ясна, заключается в том, стоит ли мне просматривать файлы ресурсов javascript в виде библиотеки или места для размещения кода, который на самом деле выполняется, т.е. $ (document) .ready. Потому что по умолчанию включены все файлы javascript, и было бы странно иметь там несколько $ (document) .ready, не говоря уже о том, что вы не хотите, чтобы функция $ (document) .ready запускалась для каждой страницы. на первом месте. Какой будет способ пойти на это? Использовать мои файлы активов в качестве библиотеки и помещать реальные вызовы в мои представления (безобразно)? Или есть лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 22 ноября 2012

Я тоже столкнулся с этой проблемой. В большом проекте вы можете сделать так, чтобы кто-то вставил код в документ, готовый, например, добавить функцию щелчка для каждого li в div с классом container .

Теперь мы можем утверждать, что приведенный выше код будет слишком общим и, конечно, может повлиять на теги li в других частях приложения, но чем больше проект, тем больше вероятность того, что вы будете столкнуться с подобным конфликтом, ведущим к неожиданному поведению.

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

В теге body каждой страницы я добавляю элементы данных, обозначающие контроллер и действие. Затем у меня есть один готовый сценарий для документа, который ищет класс, названный в честь контроллера с добавленным именем Ready, например. HomeReady. Затем он вызовет метод этого класса (предположим, что он существует), названный в честь действия. Таким образом, в вашем файле кофе вы можете написать:

class @HomeReady
  @index: ->
    alert("Hello")
  @show: ->
    alert("Goodbye")

Это позволяет контролировать вплоть до уровня действия. Когда я наткнулся на ваш вопрос, я решил упаковать это решение в жемчужину, поскольку я уже использовал его в нескольких проектах. Вы можете найти его по адресу: https://github.com/intrica/rails_document_ready

0 голосов
/ 23 февраля 2012

Если вы абсолютно не хотите, чтобы выполнялся определенный фрагмент кода инициализации, если текущая страница не является конкретным контроллером / действием, тогда вы можете попробовать добавить пустой элемент на странице с идентификатором, созданным из этой информации, например "posts_index ", используя эти два помощника:

"#{controller_name}_#{action_name}"

Затем в вашем javascript вы можете обернуть код внутри оператора if, который проверяет существование элемента с соответствующим идентификатором.

edit: Вот пример части js, которую я упомянул в комментариях.

show.html.haml

= render 'map'

map.html.erb (я обычно использую хамл, но проще написать js в эрбе)

<script src='http://www.google.com/jsapi' type='text/javascript'></script>
<script type='text/javascript'>
  ...
</script>

Возможно, он не так чист, как мог бы, и не получает преимуществ отбыть частью конвейера активов, но я не против, потому что это только то, что включается в конкретную страницу.

...