我是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'中捕获的内容。
非常感谢任何有助于调试或我所参考的样本的想法。
答案 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)。
我不知道你是否可以用它来确切地解决你的情况,但我希望这些信息有所帮助。