ajax:完成火灾但ajax:成功不在rails 3应用程序中

时间:2011-12-19 01:18:07

标签: ruby-on-rails jquery

我是RoR的新手,但在为小型应用程序实现各种功能方面取得了不错的成功。直到我遇到这个问题..对此尚未发现任何现有问题。为了帮助我将问题缩小到通用形式,我就是这样:

用户素材

向用户呈现创建主题(名称和描述)的表单,一旦创建主题,用户就会看到“显示”页面,该页面允许用户添加子主题。当用户添加子主题时,它们会在同一页面上显示给用户(这是我尝试使用ajax的地方)。

代码工件

model ==> topic_request.rb

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

controller ==&gt; 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 ==&gt; _subreqs.html.slim

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

coffeescript ==&gt; 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'中捕获的内容。

非常感谢任何有助于调试或我所参考的样本的想法。

3 个答案:

答案 0 :(得分:4)

Rails 4解决方案:添加data {type: 'text'}

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

这会将data-type="text"属性添加到表单中,jquery-ujs将该ajax方法作为参数dataType传递给jQuery的dataType方法。

根据the docs of jQuery's ajax method

  • 如果未明确指定json,则智能推断
  • 如果推断出parse error,则响应将被解析为Js对象并在出错时返回parseerror

考虑到'ajax:error'提供的{{1}}输出,可能会发生这种情况。

答案 1 :(得分:3)

我遇到了同样的问题,我做了它明确地写了请求的格式类型

例如

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

如果我不使用:格式,那么我就有同样的问题。

我希望有所帮助。问候。

答案 2 :(得分:1)

在我的代码中,我发现任何ajax响应都需要明确包含:content_type => 'text/json' ajax:success才能触发。这很奇怪,但除非您的响应明确包含此内容,否则浏览器似乎并不总是正确处理它(尤其是firefox)。

我不知道你是否可以用它来确切地解决你的情况,但我希望这些信息有所帮助。