1

我正在尝试通过 AJAX 提交嵌套表单,但我似乎无法弄清楚。我已经四处寻找解决方案,但都是徒劳的。我在这里看到了一些类似的问题,但没有一个有帮助的答案。我的 application.html.erb 布局中包含所有必要的内容、所有 gem 等。使用 Rails 3.1.1 和 Ruby 1.9.2p290。

下面是我的模型...

class Parent < ActiveRecord::Base
    has_many :children, :dependent => :destroy
    accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
    belongs_to :parent
end

这是我的表格...

<%= form_for @parent.children.new, :remote => true do |t| %>

# form fields...

<%= t.submit 'Save', :class => 'button close_modal', :id => 'submit_button' %>

我的孩子控制器...

respond_to :html, :js, :json

def create
    @child = Parent.create(params[:child])
    respond_with(@child.parent)
end

最后是我在 views/children 文件夹中的 create.js.erb 文件(这只是为了测试)......

$("#notice").html('this works')

当以上所有方法都不起作用时,我尝试将此脚本添加到表单中......

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

$("#submit_button").submit(function(){
    $.post($(this).attr("action"), $(this).serialize(), null, "script");
    return false;
})

但仍然没有运气。我在这里显示的代码将通过子控制器提交表单,然后将我重定向回父/显示视图,这是子表单所在的位置。但是,如果我从子控制器中删除“responds_with(@child.parent)”,我会收到以下错误...

Template is missing

Missing template children/create, application/create with 
{:handlers=>[:erb, :builder, :coffee], :formats=>[:html], :locale=>[:en, :en]}. 
Searched in: * "C:/Users/Owner/My Documents/Aptana Studio 3 Workspace/my_app/app/views" 
* "c:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.5.2/app/views"

因此,无论哪种情况,我都猜测该表单不是通过 AJAX 提交的。我不知道为什么。我对 Rails 以及一般的编程有点陌生,所以我不太了解 Rails 框架的幕后情况。

另一个可能相关或不相关的注意事项,我注意到我的一些 jQuery 在显示隐藏 div 中的元素时不起作用。例如,我正在处理的这个表单是通过 jQuery 通过显示一个隐藏的 div 来呈现的,而且似乎我必须在部分本身中重新编写一些按钮脚本,因为我已经包含在应用程序中的脚本.js 文件在这些按钮上不起作用,就像在其他按钮上一样。

但是,我认为这不是问题,因为我将表单直接放在视图中(未隐藏),但它仍然不起作用。

编辑

我现在注意到表单是通过 HTML 而不是 JS 提交的。因此,出于某种原因,Rails jQuery 没有绑定到表单并覆盖默认提交操作。可能是什么原因造成的?

编辑

经过进一步研究,我怀疑这个问题与我使用来自 ThemeRoller 的自定义 jQuery 文件有关。我应该做些什么来确保我的自定义 jQuery 不会干扰内置的 Rails jQuery?

有什么想法吗??

4

1 回答 1

1

啊哈!!!所以事实证明我两次包含了 jQuery 库,而且我假设顺序错误。我从 ThemeRoller 下载了一个自定义 jQuery 主题,并且我的 application.html.erb 文件中有一个指向 Google CDN 的链接。所以我在我的应用程序头中删除了对 Google CDN 的引用,然后在我的 application.js 文件中包含一些“//= require”行来引用我的自定义 jQuery 文件。

//= require jquery-1.8.2
//= require jquery-1.8.24.custom.js
//= require jquery-ui
//= require jquery_ujs
//= require_tree .

这似乎已经解决了冲突,现在我的 Rails AJAX 调用可以正常工作了!

于 2012-10-26T04:18:12.263 回答