Rails Rails 使用 AJAX 没反应

413472212 · 2012年03月23日 · 最后由 tewboo 回复于 2020年07月10日 · 8964 次阅读

最近跟着 AWDwR 第 3 版的方法创建 ajax 购物车,但修改后点击 add to cart 按钮没有在左侧刷新购物车,只显示一个白屏,显示的 url 为http://localhost:3000/store/add_to_cart/3index页面会发现购物车数据已更新。,但如果刷新 修改的代码: /store/index.html.erb中:

<%= form_tag({:action=>'add_to_cart', :id=>product}, :remote=>true ) do %>
<%= submit_tag "Add to Cart" %>
<% end %>


/layouts/store.html.erb中:

<head>
...
<%= javascript_include_tag :defults %>
...
</head>


/controllers/store_controller.rb中:

def add_to_cart
...
respond_to do |format|
    format.js
end
...
end


也写了 add_to_cart.js.rjs 模板

page.replace_html("cart",:partial => "cart", :object=>@cart)


使用的 rails 版本是 3.2.2,ruby 版本是 1.9.3 我怀疑问题出在<%= javascript_include_tag :defults %>,因为最终代码里是 <script src="/assets/defults.js" type="text/javascript"></script>,而 assets 文件夹中没有 defults.js 文件

用书上的 Rails 版本。

3.2.2 已经移除了 rjs 模板

另外你可以在终端日志输出找到问题线索

#1 楼 @Rei 那如果想要用最新版的话要怎样做?看日志记录如下: Started GET "/assets/defults.js" for 127.0.0.1 at 2012-03-23 16:12:42 +0800 Served asset /defults.js - 404 Not Found (6ms)

Started POST "/store/add_to_cart/3" for 127.0.0.1 at 2012-03-23 16:13:54 +0800 Processing by StoreController#add_to_cart as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"FBcnJUZRZ+cfxywPNWvQEjPUhh7XMfxQTaHlk6mW08M=", "commit"=>"Add to Cart", "id"=>"3"} [1m[35mProduct Load (0.0ms)[0m SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1 [["id", "3"]] Completed 406 Not Acceptable in 6ms (ActiveRecord: 0.0ms)

#2 楼 @413472212 书的中文第 4 版更新到 3.0.5 版。最新版还没有对应的中文书

或者你看官方入门向导 http://guides.rubyonrails.org/

这个日志看出请求的方法没有设置 action 的 respond_to 类型。买新书吧,第 3 版落后太多。

@413472212 如果你的程序没有使用 asset pipeline,那:defaults 选项会默认的加载 jQuery,如果你的 app 使用了 asset pipeline,那:defaults 则会加载 defaults.js.

你检查一下是否 enable 了 asset pipeline?

看你的 log,asset pipeline 是使用了。那估计是 jQuery 没有加载的原因吧

你最好不要看着 rails2 的书来练 rails3,装个 rvm 装和书对应的版本,是最好的解决办法 次之是换本书 其实 rails3.2 是默认 jquery 的,你应该什么都不用改就可以使用 jquery 了 <%= javascript_include_tag :defults %>这个去掉 看看 layouts/application.html.erb 里有 javascript_include_tag "application"就可以了

哈哈哈,我要再说一次,“哦,RJS”

当然还要保证 assets/javascripts/application.js 下是有 //= require jquery 的

#3 楼 @Rei 现在是配合着http://pragprog.com/wikis/wiki/ChangesInRails30看第三版的书有哪些改变

#9 楼 @413472212 这个书的补丁到 3.0 版本。但是 3.1 和 3.2 都有较大改变= =

这本书的 3.1,3.2 的代码都有了,建议还是去官网下代码看看代码里是怎么改的吧

#8 楼 @azhao 按照你说的改了,还是不行,assets/javascripts/application.js 下有


//=require jquery
//=require jquery_ujs
//=require_tree 

javascript_include_tag :application

#13 楼 @Rei 请问那个 add_to_cart.js.rjs 要不要删掉?

#14 楼 @413472212 不确定,以前看 3.1 的 changelog,rjs 已经被抛弃了。版本对不上真无法前进了。买中文书第 4 版配合 3.0.5 吧,这个版本到 3.2.2 主要是加了 assets pipeline。

#15 楼 @Rei 第四版不是只有英文版吗?

#16 楼 @413472212 前几天出了中文了。顺便我在整理勘误,不过因为不是第一次看很可能看不下去= =

http://codecampo.com/topics/476

<%= javascript_include_tag :defults %>:没问题,是将 public 下的 javascripts 内所有 js 文件加载。 你看你的 contrller 内是否在 respond 之前有个 render 方法调用,我这边就是因为这个!

靠,我也碰到这个问题了,跟的是第四版的书练习,但电脑上装的是 3.2.2,原先没注意到,后来仔细查看网络请求才发现。

#1 楼 @Rei 我也碰到了同样的问题。第 3 版中说删除 add_to_cart.html.erb,增加 add_to_cart.js.rjs 文件。但是具体如何解决这个问题?在 store_controller 中 format.js,就是要去寻找相对应的 js 文件吧?

#19 楼 @longerian 你怎么解决的?能贴出代码吗?

@Rei ruby_china 这个回复功能是使用 :remote => true,可是提交后是如何显示出刚刚的回复,只能手动刷新后才能显示出来。不明白。。

#21 楼 @rubyqian 其实我还没解决....最近也没时间继续学习.....

#23 楼 @longerian 我也只能手动刷新。老外提供了一段代码给我:$("#cart").replaceWith('<%=escape_javascript(render :partial => 'cart', :object=>@cart) %>'); 保存为 add_to_cart.js.erb , <%= javascript_include_tag :defults %> 改为: <%= javascript_include_tag“application” %> 我只能手动刷新才能出现。

#24 楼 @rubyqian 开浏览器的 javascript 调试器,还有看着服务器的终端日志,应该有错误信息

#11 楼 @AlphaLiu 能提供这本书的 3.1 and 3.2 的代码下载地址吗?谢谢!

#27 楼 @AlphaLiu Thank you very much !!!

#25 楼 @Rei 在日志里看不到任何错误。难道我的 chrome 和 safari 都不支持 javascript?

29 楼 @rubyqian 还不行吗?我上次做过大概知道原因了!你就是用 jquery 应该也出不来那个动画!因为需要 jquery-ui,但 3.2.2 的 jquery-rails 已经不包含 jquery-ui 了你要自己弄个放进去

#30 楼 @AlphaLiu 我是 3.1 的。代码已经下载下来了,还没有时间动手做。等下告诉你结果。谢谢哈!

#31 楼 @rubyqian 我看了下载下来的代码,里面的内容和书本上所说的例子有较大的出入。比如书本上把 cart,cart_item 等都结合在 store 的控制器里,但源代码里分别建了 cart,cart_item,store,product 等控制器。

匿名 #33 2012年04月21日

Controller:

添加 respond_to :html, :js

View:

修改 <%= form_tag :action=>'add_to_cart', :id=>product, :remote => true, :data => {:type=>"script", :method=>"post"} do %>

我也和你碰到了同样的问题,我的 rails 是 3.2.1 而我的教材是第三版,我是这样解决的, 在 store 下 new file:add_to_cart.js.erb 文件,代码:$('#cart').html("<%=j render :partial => 'cart', :object=>@cart %>"); 即可。

#34 楼 @derek 你提供的方法可以实现。待会儿研究原理。感谢!

同样是这个问题,rails 的版本问题对于我们这些新手来说真的很蛋疼,上面的貌似都试过了,还是不顶用啊,不知道如何解决,冒出的问题: Started GET "/assets/rails.js?body=1" for 127.0.0.1 at 2013-05-20 11:38:54 +0800 Served asset /rails.js - 304 Not Modified (0ms)

Started GET "/assets/store.js?body=1" for 127.0.0.1 at 2013-05-20 11:38:54 +0800 Served asset /store.js - 304 Not Modified (0ms)

Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2013-05-20 11:38:54 +0800 Served asset /application.js - 304 Not Modified (0ms)

………………

我也遇到页面空白的情况 发现是之前改了 javascript_include_tag :application 导致 js 库没有完整加载 但我在 _cart_item.html.erb 里 出现了奇怪的情况 发现不能代码不能换行 一换行 ajax 效果就没有了 还有 那个高亮渐变的效果 不能也想用 模仿之前的 helper 用 content_tag 来加 id=current_item 来解决的 但 ajax 效果就没了 而且练习里有个加一个减去链接的练习 我想用 button_to 单加了之后 ajax 效果再次消失

解决了 只要是 -%> 和双引号的问题

昨晚也遇到这个问题,今天用大家说的方法试试,希望能够解决。

create.js.rjs 替换为 create.js.erb 代码换为: $("#cart").html('<%=escape_javascript(render :partial => '/carts/cart', :object=>@cart) %>')

减少方法类似

另: _cart 可能会报错 line_items NilClass,修改: format.js { @cart = current_cart}

哎,参考了各楼层的方法,还是没能成功解决问题,小白继续找解决方案。

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