Как ограничить выполнение CoffeeScript (или JavaScript) конкретным контроллером и действием в Rails 3.1? - PullRequest
9 голосов
/ 26 мая 2011

Новый конвейер ресурсов Rails 3.1 действительно хорош, но, поскольку все файлы CoffeeScript (или JavaScript) объединены в один файл, включенный в каждую страницу, возникает вопрос:

Как мнеограничить выполнение моего скрипта конкретным контроллером или действием?Есть ли способ в моем CoffeeScript узнать, какой контроллер и действие использовались во время запроса, чтобы я мог добавить условные операторы в мой сценарий?

Или я вообще неправильно подхожу к этому?

Ответы [ 5 ]

8 голосов
/ 27 мая 2011

Тревор Бернхэм хорошо отвечает на этот вопрос здесь: Как связать файл CoffeeScript с представлением?

Он говорит:

Существует два общих подхода:

  1. Сделать поведение обусловленным наличием определенного элемента. За экземпляр, код для запуска листа регистрации должен быть предварен чем-то вроде

    if $('#signup').length > 0

  2. Сделать поведение условным для класса в элементе body. Вы можете установить класс тела с помощью ERB. Это часто желательно для таблиц стилей, как Что ж. Код будет что-то вроде

    if $('body').hasClass 'user'

А если вас интересует CoffeeScript, Тревор работает над книгой, которая выглядит очень хорошо: http://pragprog.com/titles/tbcoffee/coffeescript

1 голос
/ 20 июля 2012

Один из способов ограничить использование coffeescript конкретным представлением - создать специальный файл звездочек для рассматриваемого javascript, похожий по формату на application.js. Скажем, вы называете это extras.js.

// = требуется my_code.js.coffee

Затем используйте javascript_include_tag "extras", чтобы включить этот код в нужные представления, либо сделав пользовательский макет для этих представлений, либо с помощью content_for ()

Кстати, в вашем вопросе говорилось, что конвейер rails вынуждает вас поместить все ваши js-ресурсы в один файл. Это не правда. Часто это эффективно, чтобы избежать нескольких циклов, но вы можете иметь несколько звездочек.

0 голосов
/ 06 октября 2014

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

Установите флажок для каждого действия в контроллере:

  def index
    @gps_coords = GpsCoord.all

    # Flag for the CoffeeScript to decide which part to run
    gon.index = true;
  end

  def show
    @gps_coord = GpsCoord.find(params[:id])

    gon.lat = @gps_coord.latitude
    gon.lon = @gps_coord.longitude

    gon.show = true;
  end

В соответствующем сценарии кофе используйте эти флаги для разделения между обоими действиями:

  # index action?
  if gon.index? 
    first_coord = gon.gps_coords[0]
    map.setView([first_coord.latitude, first_coord.longitude], 15);

  # show action?
  if gon.show?
    map.setView([gon.lat, gon.lon], 15);
0 голосов
/ 15 марта 2012

что я обычно делаю, так это получаю выход: js под javascripts в моем макете, и когда мне нужен конкретный скрипт, я загружаю его прямо из моего вида с помощью:

content_for :js do
    javascript_include_tag "myscript"
end
0 голосов
/ 26 мая 2011

Почему бы не поместить javascript для конкретного контроллера в качестве представления на этом контроллере (как они там соответствуют, если так определено )?

Если ониКак правило, вы можете пометить свое представление с помощью классов, идентификаторов или данных (html5) и заставить свой javascript искать это (чтобы вы могли повторно использовать свой код).

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