Маршруты
Существуют некоторые решения, такие как js-маршруты (мой форк), которые позволят вам написать Router.post_path(3)
в вашем JS / CS.Таким образом, вы можете обойти жесткие URL-адреса.
Смешивание JS и ERB
Я бы посоветовал вам избегать смешивания JS и Ruby.В большинстве случаев вы можете обойти это путем рефакторинга вашего JS-кода, результат будет легче читать и может быть просто перемещен в чистый JS / CS-файл.
# based on your vote-link example and assuming that your link
# looks like:
#
# %a(href="#"){:"data-company-id" => @company.id} Vote
# => <a href="#" data-company-id="6">Vote</a>
makeAllCompaniesVotable: () ->
$('.company a.voteLink').click ->
companyId = $(this).data('company-id')
$.ajax
url: Router.vote_company_path(companyId)
# ...
Если вы не совершаете зло,магия, вам даже не понадобится escape_javascript
.Но вам придется удалить JavaScript изнутри ваших частичных.jquery.livequery
облегчает переход.
$(`.company`).livequery ->
# do something with $(this)
будет вызываться каждый раз, когда в документ вставляется .company
.
Жесткое кодирование DOM-путей
Если выпишем код для конкретного дерева домиков (или специального представления), я не считаю это плохой практикой.Написание ненавязчивого JS похоже на написание CSS - и мы жестко кодируем #company_list_container
в CSS, не так ли?
$("#vote_link_<%= escape_javascript(@company.id.to_s) %>") # this is ugly though
Вызов JS-кода из внешнего интерфейса
Чтобы иметь интерфейс междустатические CoffeeScript-файлы и представления, к которым я стремлюсь написать что-то вроде:
:javascript
$(function(){Companies.index()});
$(function(){Application.globalEnhancements()});
в конце моих просмотров.Затем будет вызвана функция, которую я написал с CoffeeScript, которая затем улучшит сайт всеми необходимыми сценариями.Возможно, есть более подходящие подходы (например, наличие Rails-подобного маршрутизатора для JavaScript - см. Backbone.js), но это просто и работает для меня.
Также, если мне нужны некоторые данные довольно часто (например, current_user):
:javascript
window.current_user = #{current_user.to_json};
Однако я не думаю, что существует эффективный способ рефакторинга.Я должен был сделать много рефакторинга, чтобы удалить мой беспорядок ERB / JS.Тем не менее, стоит.