Ajax: полные огни, но ajax: успех не в рельсах 3 приложения

Я новичок в RoR, но имею достойный успех с реализацией различных функций для небольшого приложения. Пока я не ударил этот вопрос.. для которого не было найдено никаких проблем/вопросов. Чтобы сузить мою проблему до общей формы, вот что у меня есть:

История пользователей

Пользователь получает форму для создания тем (имя и описание), после создания темы пользователю предоставляется страница "показать", которая позволяет пользователю добавлять подтемы. Поскольку пользователь добавляет подтемы, они отображаются пользователю на той же странице (вот где я пытаюсь использовать ajax).

Артефакты кода

model == > topic_request.rb

class TopicRequest < ActiveRecord::Base
 has_many   :subtopics, :class_name=>"TopicRequest", :foreign_key=>"parent_id"
end

controller == > topic_requests_controller.rb

class TopicRequestsController < ApplicationController
  expose(:user_topic_requests) {current_user.topic_requests}
  expose(:topic_request)
  expose(:sub_topic_request) {TopicRequest.new}

  def new
  end

  def create
    topic_request.save
    if (topic_request.parent_id != nil)
    parentreq = TopicRequest.find(topic_request.parent_id)
    render :partial => 'subreqs', \
           :locals => {:topic_requests => parentreq.subtopics}, \
           :layout => false
    else
    render :show
    end
  end

  def show
  end

  def index
  end
end

new.html.slim

= simple_form_for topic_request, :html => {:class => 'form-stacked'} do |f|
  = f.error_notification
  fieldset
    = f.input :name, :required => true
    = f.input :description, :required => true
  .actions
    = f.button :submit, "Propose Topic"

show.html.slim

# display the parent topic
= topic_request.name
= topic_request.description

#display the form for accepting subtopic requests
= simple_form_for sub_topic_request, \
                  :url => {:controller => "topic_requests", :action => "create"}, \
                  :remote => true, \
                  :html => {:class => 'form-stacked', \
                            :id => 'new_subtopic_request'} do |f|
  = f.error_notification
  fieldset
    = f.input :name, :required => true
    = f.input :description, :required => true
    = f.input :parent_id, :as => :hidden,\
              :input_html => {:value => topic_request.id}           
  .actions
    = f.button :submit, "Propose Subtopic", \
               :class => "btn", :disable_with => "Please wait..."
#subtopic_requests
  = render :partial => 'topic_requests/subreqs', \
           :locals => {:topic_requests => topic_request.subtopics}

partial == > _subreqs.html.slim

- topic_requests.each do |onereq|
  = onereq.name
  = onereq.description
  hr

coffeescript == > topic_requests.js.coffee

jQuery ->
  new_subreq_form = $("#new_subtopic_request")

  if new_subreq_form.length > 0
    new_subreq_form.bind 'ajax:before', (e) ->
      # console.log 'ajax:before'
    new_subreq_form.bind 'ajax:success', (event, data, status, xhr) ->
      $("#subtopic_requests").html(data)
    new_subreq_form.bind 'ajax:failure', (xhr, status, error) ->
      # console.log 'ajax:failure'
    new_subreq_form.bind 'ajax:error', (xhr, status, error) ->
      # console.log 'ajax:error' # parseerror eg
    new_subreq_form.bind 'ajax:complete', ->
      $("#topic_request_name").val("")
      $("#topic_request_description").val("")

Проблема

Создание подтемы происходит, я вижу новые записи в базе данных. Очистка полей от привязки "ajax: complete" также происходит просто отлично, я вижу, что эти поля ввода очищаются. Я вижу topic_requests/_subreqs.html.slim, заполняющий статус 200. Однако страница "show" не показывает результаты частичного, что я пытаюсь захватить в "ajax: success".

Любые идеи, которые помогут отлаживать или образцы, на которые я ссылаюсь, очень ценятся.

Ответ 1

Решение Rails 4: добавьте data {type: 'text'}:

= form_for vendor, :remote => true, data: {type: 'text'}

Это добавляет атрибут data-type="text" к форме, которая jquery-ujs передает метод jQuery ajax в качестве параметра dataType.

В соответствии с документами метода jQuery ajax:

  • если dataType не указывается, если разумно выводится
  • Если вывести json, ответ анализируется в Js-объект и возвращает parse error при ошибке

Это, вероятно, то, что происходит с выходом parseerror, который вы получаете от 'ajax:error'.

Ответ 2

У меня была та же проблема, и я сделал это, написав явно тип формата запроса

например

= form_for vendor, :format => :html, :remote => true, :html => {:class => "form form-edit", :'data-widget' => 'edit-vendor-form'} do |f| 

Если я не использую: формат таким образом, у меня есть та же проблема, что и у вас.

Я надеюсь на помощь. С наилучшими пожеланиями.

Ответ 3

В моем коде я обнаружил, что любой ответ ajax должен специально включать :content_type => 'text/json' для ajax:success. Это странно, но если ваш ответ явно не включает это, похоже, браузер не всегда справляется с этим правильно (особенно Firefox).

Я не знаю, можете ли вы применить это, чтобы исправить вашу ситуацию в точности, но я надеюсь, что эта информация поможет.