2010-11-16 127 views
5

如何使用jQuery UJS在选择框的更改事件在Rails中触发后提交表单?如何使用jQuery UJS在Rails中选择框的更改事件触发后通过AJAX提交表单?

我的看法是这样的:

<% for perm in @permissions %> 
    <%= form_for [@brand,perm], { :remote => true } do |f| %> 
    <tr id="permission_<%= perm.id %>"> 
     <td><%= perm.configurable.name %></td> 
     <td><%= f.select :action, ['none', 'read', 'update', 'manage'] %></td> 
    </tr> 
    <% end %> 
<% end %> 

非常简单。我的控制器就像这样:

class PermissionsController < ApplicationController 

    before_filter :authenticate_user! 

    respond_to :html, :js 

    load_and_authorize_resource :brand 
    load_and_authorize_resource :permission, :through => :brand 

    def index 
    end 

    def update 
     @permission = Permission.find(params[:id]) 
     @permission.update_attributes(params[:permission]) 
    end 

end 

而且在我的application.js:

// Place your application-specific JavaScript functions and classes here 
// This file is automatically included by javascript_include_tag :defaults 
$(function() { 
    $("#permission_action").change(function() { 
    this.form.submit(); // This needs to be an AJAX call, but how? 
    }); 
}) 

请注意,表单提交火就好了。但它正在做一个常规帖子,而不是一个AJAX提交。当我在表单上放置一个提交按钮并使用它时,AJAX提交工作正常。我需要更改:

this.form.submit(); 

给一个AJAX调用,但我不知道如何。谁能帮忙?

回答

3

我看你已经在使用jQuery这是很好的。下面的代码从这里取:http://railscasts.com/episodes/136-jquery

我强烈建议你熟悉这些屏幕投下他们帮助吨(轻描淡写)。

// public/javascripts/application.js 
jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
}) 

jQuery.fn.submitWithAjax = function() { 
    this.submit(function() { 
    $.post(this.action, $(this).serialize(), null, "script"); 
    return false; 
    }) 
    return this; 
}; 

$(document).ready(function() { 
    $("#new_review").submitWithAjax(); 
}) 
+0

感谢雨果。我实际上今天观看了这个截屏视频,并尝试了这个例子。为了引用表单,我使用了“this.form.submitWithAjax();”因为我试图从选择框的更改事件中引用表单。我一直在收到“submitWithAjax不是函数”。 – AKWF 2010-11-16 21:13:41

+1

我无法尝试此操作,但可以在submitWithAjax定义中将this.submit(....)这一行更改为this.form.submit(....)。也许你试过idk。让我知道。 – Hugo 2010-11-16 21:17:15

+0

是的,这对我来说没有任何结合。这非常非常令人沮丧。我终于没有得到这个工作: $( “#permission_action”)改变(函数(){ \t \t $阿贾克斯({ 类型: “PUT”, 网址:this.form.action, 数据: “许可[动作] =” + $( “#permission_action”)VAL() }); 返回假; }); 但它只适用于第一线!屏幕上的每一行都带有一个名为“permission_action”的选择框。我没有意识到jQuery只会默认绑定到特定名称的第一个元素。 – AKWF 2010-11-16 21:25:04

4

通过jQuery的UJS来源来看,我想,这可能是最安全的方法:

// in application.js 
jQuery.fn.ajaxSubmit = function() { 
    this.trigger('submit.rails'); 
}; 

它只是作为触发将.submit(事件),但在UJS的味道,所以你会打电话

$('.my_form').ajaxSubmit(); 
相关问题