新手问题 Ajax in Rails

zhaojiahui · 2012年10月26日 · 最后由 agnovo_wl 回复于 2013年07月29日 · 3510 次阅读

我的 Rails 及 Ruby 的版本如下,使用的是 ubuntu 11.10 Rails --version: Rails 3.2.6 Ruby --version: ruby 1.9.3p194 最近在看《Web 开发敏捷之道》第四版,看到 Task F: Add a Dash of Ajax 时有些困惑,书上说要用 create.js,rjs,可是我搜到@Rei的这篇 blog http://chloerei.com/2012/04/21/rails-3-2-ajax-guide/ ,说是这种方式已经在 3.1 以后被移除了,然后我使用 Rei 的方法 app/views/store/index.html.erb:

<%= button_to 'Add to Cart', line_items_path(:product_id => product), :remote => true %>

然后在 app/controllers/line_items_controller.rb 中:

def create
    @cart = current_cart
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)
    respond_to do |format|                                            
  if @line_item.save
    format.html { redirect_to(store_url) } 
    format.json { render json: @line_item, status: :created, location: @line_item }
  else
    format.html { render action: "new" }
    format.json { render json: @line_item.errors, status: :unprocessable_entity }
  end
end  

在我加了:remote => true 这个参数后,每点一次 Add to Cart 后,增加的数量是 2,不是 1,难道是我这个参数的位置放错了?还有,每次 Add to Cart 后,都要手动刷新一下,才会显示侧边栏 Cart 的更新,而不是它自己更新。 最后,我去看了下这本书的源码,书本作者在 3.2 下用的是在app/views/line_items/文件夹下增加一个 create.js.erb(书本上是用.rjs)。 我困惑了,我是该按照书本的方式,还是按照@Rei的方法,在 Rails 下使用 Ajax,若是按照 Rei 的方法,我又该怎么写? 纯新手,求指导~~

:remote => true 要 respond 的类型是 .js

把项目 push 到 github 上看看你的源码。

PS:我觉得顶楼代码没闭合啊

#1 楼 @Rei 好的,https://github.com/zjhui/depot 我现在做到了 Task F , Iteration F1 那,F2 没做。。

#1 楼 @Rei 稍等,刚发你的似乎有点问题,我去瞅瞅

#1 楼 @Rei 应该 OK 了,不好意思,@你这么多次

#4 楼 @zhaojiahui 解决了?我要完善才有时间跑起来调试

1 楼主之前执行了 rake assets:precomplie 没有清理,相同的 js 被载入了两次,所以 ajax 请求被绑定了两次,post 了两次请求。

解决:rake assets:clean

2 create.js.rjs 这个文件,rjs 已经被弃用了。

解决:删掉 create.js.rjs,新建一个 create.js.erb,内容为

$('#cart').html('<%= escape_javascript render(@cart) %>');

控制器里面加一行

if @line_item.save
  format.html { redirect_to(store_url) } 
  format.json { render json: @line_item, status: :created, location: @line_item }
  format.js # <---------
else
  format.html { render action: "new" }
  format.json { render json: @line_item.errors, status: :unprocessable_entity }
end

中文书版本太旧我也表示无奈,楼主要不完全照着中文书上的版本 3.0.5 联系,要不买最新版的英文电子书学习。

#6 楼 @Rei 我看的是英文版第四版的~等明天去试试你的方法

#6 楼 @Rei 删掉 create.js.rjs,新建一个 create.js.rjs , 这里在 rails 3.2 下应该是 create.js.erb

#8 楼 @zhaojiahui 奥,我粘贴错了,你说得对。

#9 楼 @Rei 请问一下 rake assets:precomplie 的作用是什么?

#10 楼 @zhaojiahui 把 assets 文件编译打包到 public/assets 目录下,生产环境用的。

#7 楼 @zhaojiahui 如果英文版还是用 rjs,说明版本还是旧了。我看最新版的 changlog 已经用到 3.2.x 了。

#12 楼 @Rei 是的,我看的这本英文版的是用 3.0 的

#13 楼 @zhaojiahui 那还不如中文版版,中文版是 3.0.5

#14 楼 @Rei 好吧。是还不如看中文版的了,我看的这个英文版也是 3.0.5~擦擦

#2 楼 @zhaojiahui 楼主,不知你的问题解决没有呀?我在这也遇到问题了,不过我的问题是,点击 button_to 后,会产生 js 请求(属正常反应),还会产生 html 的 post 请求(非正常的反应),所以 cart 的内容会增加 2。郁闷中 ......

#1 楼 @Rei 大牛,我在这也遇到问题了,不过我的问题是,点击 button_to 后,会产生 js 请求(属正常反应),还会产生 html 的 post 请求(非正常的反应),所以 cart 的内容会增加 2。郁闷中 ......不知何解呀?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号