Rails 3.0.9没有执行Ajax响应

时间:2011-08-17 16:11:37

标签: ruby-on-rails ajax ruby-on-rails-3 jquery

我正在使用Rails 3.0.9和jQuery 1.6.2和jQuery-ujs。

基本上我想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')) %>");

每当添加新项目时更新购物车项目编号。

当我点击“添加到购物车”按钮时,会向服务器发送一个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>

2 个答案:

答案 0 :(得分:0)

就我所知,它看起来很不错。有些事我会尝试这样一个谜:尝试取出你的按钮url中的:format=>'js'(我很确定rails知道它是为js格式化的)。而不是respond_to do |format|块,尝试摆脱所有这些并使用respond_with(@line_item) 在控制器的顶部,请务必指定respond_to :js

我同意要求执行简单警报而不是使用escape_javascript渲染部分的评论。

如果仍然没有得到任何内容,请切换到link_to,看看是否可以获得任何结果。

答案 1 :(得分: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

我从教程中复制了此代码以配置字符集。不知道为什么它搞砸了一切,但我现在可以继续我的项目了!