新手问题 [已解决] 添加 Ajax 点击 add_to_cart 侧面购物车不新增数据?

wangyzyoga · 2015年01月27日 · 最后由 way_von 回复于 2016年04月03日 · 3660 次阅读

添加 Ajax 点击 add_to_cart 侧面购物车不新增数据?效果如图:

index.html.erb
<%= form_tag({:action=>'add_to_cart', :id=>product}, :remote=>true ) do %>
  <%= submit_tag "Add to Cart" %>
<% end %>
StoreController
def add_to_cart
  product = Product.find(params[:id])
  @cart = find_cart
  @cart.add_product(product)
  redirect_to_index and return        
  respond_to do |format|
    format.js
  end

后台日志: Started POST "/store/6/add" for 127.0.0.1 at 2015-01-27 17:33:45 +0800 Processing by StoreController#add_to_cart as JS Parameters: {"utf8"=>"✓", "commit"=>"Add to Cart", "id"=>"6"} Product Load (0.3ms) SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1 [["id", 6]] Redirected to http://127.0.0.1:3000/store/index Completed 302 Found in 6ms (ActiveRecord: 0.3ms)

Started GET "/store/index" for 127.0.0.1 at 2015-01-27 17:33:45 +0800 Processing by StoreController#index as JS Product Load (0.8ms) SELECT "products".* FROM "products" ORDER BY title desc Rendered store/index.html.erb within layouts/store (12.1ms) Rendered store/_cart_item.html.erb (0.1ms) Rendered store/_cart.html.erb (31.6ms) Completed 200 OK in 298ms (Views: 295.4ms | ActiveRecord: 0.8ms)

忘记说了,使用的 Rails 4.2.0,Ruby 2.1.2。

坐等高手回复,在网上看资料,东改西改,晕乎乎的。

两个问题: 1、既然用了 ajax 那就不需要 redirect 了,应该直接在 format.js 里处理 2、controller 里面 add_product 没有在日志中看到 save,重定向了怎么会有新增数据

#3 楼 @xxqfamous 1:不加 redirect 这行,点击 add_to_cart,后台报错,错误信息:

ActionView::MissingTemplate (Missing template store/add_to_cart, application/add_to_cart with {:locale=>[:en], :formats=>[:js, :html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}.

2:开始不加 ajax,点击 add_to_cart,左侧购物车和主页都会显示一条添加内容呀?

#4 楼 @wangyzyoga 默认使用模板了,你不能让方法去 render,道理是这样。

#5 楼 @Ryan 那如何更正?

#6 楼 @wangyzyoga 只能告诉你道理。。。我也不是做 ruby 的。而且坛子里不会有人手把手给你贴代码的。只能自己摸索。google 吧。

#7 楼 @Ryan 好的,我在搜搜,谢谢了。

首先要理解你想返回的到底是什么,是 javascript 还是 html. 如果你在 form_tag 里面用了 remote: true,那么 rails 的 ujs 会把你的表单以 ajax 形式提交,并且你的请求会接受 js 返回的 response(Accept: text/javascript),这个时候你可以用format.js 或者 render js。 反言之如果不用 remote: true,那么就是普通的提交表单,这个时候你用 redirect_to 是会重定向到 你指定的 index,再走一遍 index 所对应的链接。

所以说如果 add_to_cart 只接收 javascript 发来的 ajax,那么 redirect_to 可以去掉。 那么这个时候就要告诉请求,我到底该返回什么?因为已经指定了返回 js(Accept: text/javascript),那么就再一段js代码放在view里去渲染(render)就好了。format.js 其实是省略了一句 return render :add_to_cart,那你在 view 中加一个文件,

# store/add_to_cart.js.erb
# 假设你的cart 有算总价的方法
$('你的总价的html元素').html("<%= @cart.sum_price %>");

#5 楼 @Ryan #9 楼 @MrPasserby 发现为什么没 render,教程里说加个 js.rjs 文件,但是后来在网上查说不支持这文件,有说改成 js.ujs 有说改成 js.erb,之前用的 js.ujs,现在改成 js.erb 后台日志就没错误。现在问题又回到点击 add_to_cart 侧面购物车不新增数据,应该是我的 js.erb 内容不对

sotre/add_to_cart.js.erb
page.replace_html("cart", :partial => "cart", :object => @cart)

#10 楼 @wangyzyoga cart 对象是老对象还是新对象。输出 cart 对象成员,查看数据是否更新

我记得上次你发帖求助的时候就跟你说过用 rails4 就不要按照你现在看的书来做了,要按照你现在的书来做的话就用那本书里的版本 rails3,rails4 已经不用 rjs 了,要学就按照最新版本的吧

这个是坑,rails4 开始使用 ujs 了,语法都使用 javascript 而不是一些助手方法了。 具体的坑可以看我当年的笔记,希望可以帮到你。^_^ http://akiraray.iteye.com/blog/1910856

#11 楼 @Ryan 还在研究怎么输出 cart 对象,判断是否更新。不过我把 js.erb 文件改成: $("#cart").html("<%= j render partial: "cart", object: @cart %>") #13 楼 @akirapanda 你的笔记我之前都收藏了。

#10 楼 @wangyzyoga 建议你还是换一个新版的教程,版本不对确实很多问题。

<%=j %> 是啥意思

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