Ответ 1
В своем вызове $.ajax
обязательно установите для параметра dataType
значение "script"
, иначе ответ может быть интерпретирован другими способами и, следовательно, не выполнен как JS.
Я создаю форму в рельсах, которые будут редактировать существующий вопрос через ajax.
После того, как форма отправлена и вопрос обновлен, метод обновления в контроллере отображает update.js.erb, который снова скроет форму.
Моя проблема в том, что код javascript в update.js.erb вообще не выполняется.
Я знаю, что файл является рендерингом, потому что он отображается на выходе сервера, и когда я помещаю
<% raise params %>
он работает.
Однако даже самый простой
alert('hello');
не действует в том же файле.
Я исключил проблемы с настройкой javascript и jquery, потому что тот же код отлично работает в моем файле edit.js.erb. Он просто не работает в update.js.erb.
Что мне не хватает?
Изменить:
Firebug не показывает ошибок. Вот ответ на сетевой панели firebug:
alert('hello');
$('#question_body').replaceWith('<h4><p>jhsdfjhdsb k jdfs j fjfhds <strong>jfshaflksd;hf sdldfs l fdsalkhdfskhdfs</strong>;fd lfdksh hfdjaadfhsjladfhsjadfs ;df sjldfsj dfas hafdsj fdas ;ldfas ldfs df dl;hdf fdh ;fdj ;lfads</p></h4>');
def update
Изменить 2:
Это действие контроллера:
def update
respond_to do |format|
if @question.update_attributes(params[:question])
format.html { redirect_to @question, :flash => { :success => 'Question was successfully updated.' } }
format.json { head :no_content }
format.js {}
else
format.html { render action: "edit" }
format.json { render json: @question.errors, status: :unprocessable_entity }
end
end
end
В своем вызове $.ajax
обязательно установите для параметра dataType
значение "script"
, иначе ответ может быть интерпретирован другими способами и, следовательно, не выполнен как JS.
Вы работаете с haml или html.erb? Если первое, то это может быть решением:
respond_to do |format|
...
format.js {render layout: false}
end
У меня была одна и та же проблема, я нашел этот вопрос на ранней стадии, занял еще один час Googling, чтобы найти этот вопрос в StackOverflow, который привел меня к нему: jQuery + Ajax + Haml, Файлы js.erb не запускаются
В вашем файле update.js.erb вам нужно избежать javascript везде, где вы выполняете рубиновый код.
$('.container').empty().append('<%=
escape_javascript(
render 'update'
)
%>')
Это то, что решило это для меня...
Эта проблема возникает не только из-за Контроллер. Он также может быть на стороне Вид, который не уточнил тип данных вашего запроса на отправку.
Убедитесь, что в консоли консоль обрабатывается как JS.
Ссылка: Аналогичная проблема
Я столкнулся с той же проблемой и нашел эту страницу. Я пробовал методы, перечисленные здесь, но не нашел удачи. Хотя позже следующий метод решает мою проблему.
Мой исходный код:
$('#html_id').html('<%[email protected]_variable%>');
И я обновил его до:
$('#html_id').html('<%=raw @ruby_variable.to_json%>');
Теперь он работает так, как ожидалось.
Узнал, что это такое! 😊 (решение для рельсов 4)
Если у вас есть параметры вашего аякса, которые не указаны в вашем разрешенном списке, запись сохраняется, вы не получаете сообщений об ошибках о "недопустимых" параметрах, но update.js.erb не будет работать - даже хотя ваш терминал будет возвращать "Rendered update.js.erb и т.д."
Если дополнительный параметр является атрибутом в вашей модели, просто разрешите его.
Самый простой способ разрешить немодельный параметр - добавить в свою модель:
attr_accessor :paramKeyTroublesome
Затем вы также можете разрешить его в контроллере.
в вызове $ajax, данные должны быть правильно обработаны:
data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}
Еще одна проблема, о которой следует знать, - это ошибка в вашем файле update.js. Ничего не будет выполняться, если есть какие-либо синтаксические ошибки. Вы можете проверить это, зайдя в инспектор браузера и включив Log XMLHttpRequests
затем просмотрите выходной файл js.