Rails Ajax: .js.erb отображается как текст, а не JS - PullRequest
6 голосов
/ 15 марта 2011

У меня проблемы с rails3 для рендеринга Javascript (если это актуально, я использую JQuery, и он отлично работает, поскольку используется во многих других частях приложения) вместо html.

Что яhave: I view, у меня есть эта ссылка:

<%= link_to 'Edit', edit_user_repreneur_path(@user_repreneur, :format => :js), :remote => true %>

Прежде всего, я не совсем понимаю, почему мне нужно добавить: format =>: js, чтобы заставить контроллер использовать представление JS, а не HTML.Вот код контроллера:

def edit
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id])
    respond_to do |format|
      format.js
      format.html
    end 
end

В начале класса контроллера у меня есть эта строка:

  respond_to :js, :html

Мой файл edit.js.erb содержит одну строкус предупреждением.Однако при визуализации страницы JS отображается как текст и, следовательно, не выполняется.Я попытался изменить строку format.js на

format.js { render :layout => false }

Но это ничего не меняет.Я предполагаю, что что-то упускаю, но я действительно не понимаю, что ...

Заранее большое спасибо, ура!

PS: Я не знаю, полезно ли это,но прежде чем добавить бит: format =>: js в помощник по ссылкам, представление всегда отображалось как HTML, и если я прокомментировал строку format.html, у меня была ошибка 406 Not Acceptable на стороне сервера.

Ответы [ 4 ]

13 голосов
/ 15 марта 2011

Не думаю, что проблема в вашем серверном коде. Все это выглядит хорошо для меня. И тот факт, что это рендеринг edit.js.erb доказывает, что ваш серверный код работает нормально.

Проблема на вашей стороне клиента. Когда он получает ответ Ajax, он не выполняет его как javascript. Он выполняет его как текст.

У меня недавно была эта проблема, и я хотел бы иметь при себе свой код, но я на работе. Однако я лично написал запрос jQuery Ajax вместо того, чтобы полагаться на :remote => true, поскольку эта опция в основном используется в формах.

Попробуйте дать свой link_to идентификатор, а затем поместите этот jQuery в свой application.js или где-либо еще.

$('#link_id').click(function(){
   $.ajax({
      type : 'GET',
      url : '/:controller/:action/',
      dataType : 'script'
   });
   return false;
});

Это захватит событие нажатия ссылки, отправит запрос на сервер, который должен вернуть ваш файл edit.js.erb, а затем выполнит его как скрипт.

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

Прочтите JQuery's Ajax , чтобы узнать о дополнительных возможностях и подробностях о данных POSTing.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ: Другие возможные решения включают использование UJS в качестве драйвера Javascript. Вы можете прочитать документацию по https://github.com/rails/jquery-ujs и просмотреть Railscast по теме Ненавязчивый Javascript с использованием UJS.

1 голос
/ 06 октября 2015

Файлы js.erb отображаются в виде текста, если в ваш файл application.js не включена библиотека jquery_ujs:

//= require jquery
//= require jquery_ujs

И вам понадобятся следующие драгоценные камни в вашем файле:

gem 'jquery-rails'
gem 'jquery-ui-rails'
1 голос
/ 19 ноября 2011

Кажется, немного поздно, чтобы дать этот ответ, но лучше поздно, что никогда.

Вы смешиваете response_to и response_with.В верхней части вашего класса контроллера используйте response_to: js,: html.Затем вставьте это в ваше действие редактирования

def edit
  @user_repreneur = UserRepreneur.find_by_id_view(params[:id])
  respond_with @user _repreneur
end 
0 голосов
/ 18 февраля 2015

Если вы находитесь на рельсах,

Простое исправление: добавьте data-type = "script" в форму.Источник: https://github.com/rails/jquery-ujs/wiki/Unobtrusive-scripting-support-for-jQuery

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