2011-08-17 57 views
0

我使用Rails 3.0.9和jQuery 1.6.2与jQuery-ujs。Rails 3.0.9未执行Ajax响应

基本上我想ajaxfy我的“添加到购物车”的行动。

笔者认为:

<td><%= button_to "Add to cart", line_items_path(:coupon_id => coupon, :format => :js), :remote => true %> 

在我的控制器:

def create 
@cart = current_cart 
coupon = Coupon.find(params[:coupon_id]) 
@line_item = @cart.add_coupon(coupon.id) 

respond_to do |format| 
    if @line_item.save 
    format.html { redirect_to(@line_item.cart) } 
    format.js {render :layout => false, :content_type => 'text/javascript'} 
    format.xml { render :xml => @line_item, :status => :created, :location => @line_item } 
    else 
    format.html { render :action => "new" } 
    format.js {render :layout => false, :content_type => 'text/javascript'} 
    format.xml { render :xml => @line_item.errors, :status => :unprocessable_entity } 
    end 
end 

我还创建了一个create.js.erb:

$("#my_cart").html("<%= escape_javascript(render(:partial => 'layouts/mycart')) %>"); 

更新购物车的物品编号,每当一个新的em被添加。

当我点击“加入购物车”按钮,JS POST请求被发送到服务器:

Started POST "/line_items.js?coupon_id=1" for 127.0.0.1 at Thu Aug 18 00:04:31 +0800 2011 
    Processing by LineItemsController#create as JS 

,并从服务器的响应是:

Rendered layouts/_mycart.html.erb (5.3ms) 
Rendered line_items/create.js.erb (28.9ms) 
Completed 200 OK in 127ms (Views: 58.7ms | ActiveRecord: 3.0ms) 

响应的身体包含更新我的购物车的javascript代码:

$("#my_cart").html("<li id=\"my_cart\"><a href=\"/carts/10\">My cart(1)<\/a>\n<\/li>"); 

但是,网页未更新。我尝试了不同的浏览器(Chrome,Firefox,Safari)。但是,如果我手动在Firebug的控制台中运行此代码,页面已更新。我搜索了一天,尝试了不同的解决方案。他们都没有工作过我。有人能解决我的问题吗?

下面是button_to生成的代码:

<form method="post" action="/line_items.js?coupon_id=1" data-remote="true" class="button_to"><div><input type="submit" value="Add to cart" /><input name="authenticity_token" type="hidden" value="MdHScf0JVNu2UFXLxuindDvZ5TPBztfMMzv57w1LWX8=" /></div></form> 
+0

你确定'#my_cart'存在吗?尝试使用简单的警报对其进行测试 – fl00r

+0

您可以验证您的JavaScript文件是否正在执行?警报或东西....另外,你可以张贴由button_to erb生成的html吗? – voxobscuro

+0

我以前试过alert()并得到了同样的结果:javascript从服务器返回,但没有被浏览器执行。我必须在Firebug的控制台中手动执行代码来触发警报框。 – SteveFan

回答

0

它看起来相当不错,据我可以告诉。有些事情我会试试这样一个谜题:尝试取出你的按钮url中的:format=>'js'(我非常确定rails知道它将被格式化为js)。而不是respond_to do |format|块,尝试摆脱所有这些,并使用respond_with(@line_item) 在控制器的顶部,确保指定respond_to :js

我同意要求做一个简单的警报,而不是escape_javascript渲染部分的意见。

如果仍然没有得到任何东西,切换到link_to,看看你是否能得到任何结果。

0

问题解决了!

我创建了一个具有相同设置的新项目,并尝试如果Ajax在那里工作。令人惊讶的是,它的确如此。所以我得出结论,我的项目中一定有一些错误的设置。

而且我发现和我的application_controller.rb删除此:

def set_charset 
     headers["Content-Type"] = "text/html; charset=utf-8" 
    end 

    def configure_charsets 
     response.headers["Content-Type"] = "text/html; charset=utf-8" 
     suppress(ActiveRecord::StatementInvalid) do 
     ActiveRecord::Base.connection.execute 'SET NAMES UTF8' 
     end 
    end 

我复制此代码的教程来配置的字符集。不知道为什么它把所有东西搞砸了,但我现在可以继续我的项目!