вызовите файл .js.erb вместо .html.erb

У меня есть приложение Rails с картой Google. Я хочу заполнить его маркерами, используя файл .js.erb, чтобы у меня был доступ к рубиновым переменным в javascript. Я не хочу использовать Gon Gem.

Есть ли способ вызвать файл .js.erb вместо файла .html.erb?

Один из способов обойти это - загрузить .html.erb, а затем выполнить автоматический вызов ajax для загрузки .js.erb, но я ищу лучшее решение.

Спасибо.


person user2725109    schedule 24.04.2014    source источник


Ответы (2)


Контроллер действительно не подходит для этого, поскольку его задача — отвечать на запросы. Если приходит запрос и ожидается возврат HTML, Rails возвращает HTML. Если это запрос JS, он отправляет JS обратно.

Правильный способ сделать это — загрузить страницу с помощью HTML, а затем выполнить вызов AJAX со страницы. Вы даже можете отправить его на то же действие, и Rails ответит соответствующим шаблоном js.erb. Если вы хотите дать ему специальные инструкции, возможно, если вы хотите, чтобы ваш JSON отображался определенным образом, вы можете сделать это с помощью respond_to или драгоценного камня JBuilder.

Редактировать: Вышеприведенное написано в предположении, что вы загружаете страницу через обычный HTML-запрос и хотите, чтобы она выполняла как HTML, так и JS. Если вы уже находитесь на странице и хотите выполнить вызов AJAX через ссылку, кнопку или форму без рендеринга HTML вообще, вы можете сделать это, добавив remote: true к любым тегам form_for, form_tag, button_to или link_to.

person subvertallchris    schedule 24.04.2014
comment
То, что вы предлагаете, - это то, что я делал до сих пор (см. вопрос выше), но я хочу знать, есть ли другой способ избежать двух отдельных вызовов сервера. Я думал поместить ‹% render 'XXX.js.erb' %› в свой .html.erb для вызова файла .js.erb, но это не сработало. - person user2725109; 24.04.2014

Если вы хотите избежать повторного вызова и не ожидаете, что ваш контроллер должен будет отвечать в формате JSON, вы можете поместить нужные данные в атрибуты данных HTML5 прямо в своем представлении. Они существуют специально для предоставления информации JS. Вы можете просто сделать один с его значением, установленным в массив, содержащий ваши маркеры, а затем запустить ваш скрипт через каждый элемент этого массива.

person subvertallchris    schedule 25.04.2014