2011-12-19 8 views
10

Soy nuevo en RoR, pero tengo un éxito decente con la implementación de varias funciones para una aplicación pequeña. Hasta que llegue a este problema ... para el cual no he encontrado ningún problema/pregunta. Para ayudar a reducir mi problema de una forma genérica, esto es lo que tengo:ajax: incendios completos pero ajax: éxito no en una aplicación de rails 3

historia de usuario

usuario se le presenta un formulario para crear temas (nombre de la descripción &), una vez que se crea tópico usuario es presentó la página 'mostrar' que permite al usuario agregar subtemas. A medida que el usuario agrega subtemas, se muestran al usuario en la misma página (aquí es donde estoy tratando de usar ajax).

artefactos de código

modelo ==> topic_request.rb

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

controlador ==> 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} 

== parcial> _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("") 

Problema

Creación del subtema sucede, veo nuevos registros en la base de datos. El borrado de los campos de la vinculación 'ajax: complete' también sucede muy bien, veo que los campos de entrada están desapareciendo. Veo topic_requests/_subreqs.html.slim completando con el estado 200. Sin embargo, la página 'show' no muestra los resultados de renderizar el parcial, que es lo que intento capturar en 'ajax: success'.

Cualquier idea para ayudar a depurar o muestras que me refiero a hacer esto es muy apreciada.

Respuesta

3

que tenían el mismo problema y lo hice funciona escrito de forma explícita el tipo de formato de la solicitud

por ejemplo

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

Si yo no uso: Formato de esa manera entonces tengo el mismo problema que tienes.

Espero ayuda. Saludos.

1

En mi código, he encontrado que cualquier respuesta ajax necesita incluir específicamente :content_type => 'text/json' para ajax:success disparar en cualquier momento. Es extraño, pero a menos que tu respuesta incluya esto explícitamente, parece que el navegador no siempre lo maneja correctamente (especialmente Firefox).

No sé si puede aplicar eso para arreglar su situación exactamente, pero espero que la información ayude.

4

Carriles 4 solución: añadir data {type: 'text'}:

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

Esto añade el atributo data-type="text" a la forma, que jquery-ujs pases para el método de jQuery ajax como parámetro dataType.

Según the docs of jQuery's ajax method:

  • si dataType no se especifica si se infiere inteligente
  • si se infiere json, la respuesta se analiza en un objeto Js y devuelve un parse error en error

Esto es probablemente lo que está sucediendo dado el resultado parseerror que obtienes de 'ajax:error'.

+1

Esto funcionó para mí. –

+1

¡Funciona! muchas gracias. – Ritikesh

Cuestiones relacionadas