Какая польза от преобразования файла .js в файл .js.erb в Rails? - PullRequest
0 голосов
/ 19 октября 2011

Я не смог понять, почему нужно добавлять расширение .erb в обычный файл .js в папке app / assets? Вот как я удивился этому:

В моем приложении я хочу, чтобы в тело HTML-страницы / DOM было включено не более одного HTTP-запроса на файл js. Это можно сделать, добавив имена файлов js (с включением таких строк) в файл манифеста application.js:

    //= require jquery
    //= require directory_name 
    //= require jQuery_plugins/carousel
    //= require jQuery_plugins/word-editor
    //= require jQuery_plugins/abc_something

и т. Д.

Теперь у меня есть длинный список javascripts для всего приложения rails, и я хочу, чтобы файл манифеста выводил (включал) javascripts для конкретной страницы. Чтобы справиться с этим, я попытался добавить условия, такие как:

    if params[:controller] == "my_controller" && params[:action] == "index"
      //= require jQuery_plugins/carousel

Также я преобразовал файл application.js в файл application.js.erb, чтобы проверить, работает ли он. Но нет! Это не работает. Манифест выдаст все, что попадется на его пути. Похоже, что был задан вопрос о подобной проблеме в SOF, но решения, приведенные в ответах, кажутся очень устаревшими и довольно нечистыми традиционным способом.

Где-до-вы-пут-ваш-страницу конкретного использования JavaScript-код

Так что же на самом деле означает использование преобразования js в файл js.erb? И можно ли управлять выводом для конкретной страницы исключительно на основе файла "js manifest"?

Ответы [ 2 ]

1 голос
/ 25 мая 2012

Я использую его для таких вещей, как:

if (<%=j @tarea.errors[:texto].any?.to_s%>){
    $('#texto_tooltip').html("<%= @tarea.errors[:texto].first.to_s %>");
    $('#texto_field').addClass("error-box");
}

, в зависимости от состояния объекта, я могу выполнить какой-то jquery или другой

1 голос
/ 09 декабря 2011

Итак, у вас есть .js.erb, чтобы вы могли встраивать код ruby ​​в ваш js, который будет выполняться и выводить js в середину файла. Может быть, этот ответ слишком очевиден.

Одна из причин, по которой вы можете захотеть сделать это, - использовать помощник asset_path для встраивания пути к другому активу приложения в строковый литерал js. Я думаю вы также можете использовать url_for или другие помощники по маршруту, скажем, для встраивания URL-адреса определенного действия приложения в строковый литерал JS. Но я не пробовал этого, , а не , каждый обычный вспомогательный метод Rails доступен в ERB-ресурсах, только подмножество, и они не всегда работают точно так же, как обычные помощники.

То, что вы можете не сделать, - это то, что вы предлагали изначально, встроить ruby, который является условным для текущего запроса или текущей страницы. Это связано с тем, что ресурсы в конвейере ресурсов не компилируются (то есть выполняются) для каждого запроса (по крайней мере, обычно не в производстве), а вместо этого они компилируются только один раз в течение срока службы приложения и кэшируются - поэтому в момент скомпилировано и кэшировано, нет «текущего» запроса или страницы или параметров запроса.

В общем, .js.erb, вероятно, используется не слишком часто, он существует только для согласованности и на тот случай, если вам это нужно. Вероятно, есть и другие странные случаи, когда было бы удобно иметь код Ruby, генерирующий код JS в активе, даже без использования вспомогательных методов url. Так почему бы не сделать это возможным, так как конвейер активов означает, что активы в любом случае проходят некоторую обработку / выполнение, просто естественно позволить вам отправлять их через ERB, если хотите.

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