Куда должен JavaScript со встроенным кодом Ruby идти в приложении Rails 3.1? - PullRequest
4 голосов
/ 06 сентября 2011

Для приложения на Rails 3.1 некоторые из JavaScript всего моего сайта включаются, только когда выполняются определенные условия в реальном времени, особые условия экземпляра. Это означает, что я не могу поместить его в файл application.js нового конвейера активов, потому что он не анализируется erb для встроенного Ruby в текущем контексте. По сути, я включаю сочетания клавиш на основе текущего пользователя, который вошел в систему.

Мой вопрос: куда должен идти этот JavaScript со встроенным кодом, чтобы встроенный Ruby по-прежнему анализировался для каждого доступа к странице с соответствующим контекстом (т.е. текущим, вошедшим в систему пользователем)?

Ответ, похоже, заключается в том, чтобы поместить его в представление макета application.html.erb внизу, но это выглядит так, будто я прячу код javascript в не интуитивно понятном месте.

Я попытался создать файл application2.js.erb, но затем я получил ошибки о неопределенных переменных, которые, я думаю, могут быть из-за того, что механизм ресурсов анализирует этот файл только один раз, прежде чем выходные данные кэшируются, а область действия исправить еще для таких вещей, как current_user.

Итак, использование application.html.erb прекрасно работает здесь, и вопрос не в том, как заставить его работать функционально. Вместо этого мне интересно, есть ли более элегантный способ интегрировать модель конвейера ресурсов с моими требованиями, и при этом по-прежнему хранить большую часть моего JavaScript в каталоге assets / javascripts.

Ответы [ 3 ]

0 голосов
/ 07 сентября 2011

Хорошо, о ненавязчивом JS.Это будет просто концепция (HAML):

По вашему мнению, где-то

# hotkeys are "Ctrl+C", "Ctrl+A"
-current_user.hotkeys.each do |hotkey|
  %hotkey{ "data-key" => hotkey.key, "data-behavior" => hotkey.fn  }

Тогда в вашем application.js

$(document).ready(function(){
  if($("hotkey").length > 0){
    $("hotkey").each{function(this){
      key = $(this).data("key");
      fn  = $(this).data("behavior");
      $(document).bind('keydown', key, fn);
    }}
  }
})

Так что тот же JS будетизвлечь из данных горячих клавиш HTML и затем связать их.

0 голосов
/ 12 сентября 2013

Как отмечают некоторые люди, есть два варианта:

  • Поместите свой JavaScript внутри представления (и, как вы говорите, это не совсем правильно).
  • Поместите его в файл JavaScript. Создайте в своем представлении условие, включающее этот файл javascript, если соблюдены определенные условия.

Если вам нужно передать больше переменных экземпляра из контроллера в ваш javascript, этот гем под названием gon может сделать вашу жизнь проще.

Это позволяет вам использовать конвейер активов по умолчанию, используя следующий javascript:

if(gon.conditional){
  //your embedded js code here
}

Если вы хотите узнать больше об этом драгоценном камне, просмотрите этот railcast , где все объясняется.

0 голосов
/ 06 сентября 2011

Вы должны попытаться создать app / assets / javascripts / application2.js.erb (или любое другое лучшее имя, которое вам придет)

А затем поместите что-то подобное в ваш app / assets / javascripts / application.js:

//= require application2

И тогда вы можете иметь

<%= javascript_include_tag 'application2' %>

где вы хотите - например, в вашем application.html.erb.

Кстати, если вы хотите настроить то, что включено для каждого просмотра, вы можете найти content_for полезным. Проверьте это скринкаст

...