最近跟着 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 文件
#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?
你最好不要看着 rails2 的书来练 rails3,装个 rvm 装和书对应的版本,是最好的解决办法 次之是换本书 其实 rails3.2 是默认 jquery 的,你应该什么都不用改就可以使用 jquery 了 <%= javascript_include_tag :defults %>这个去掉 看看 layouts/application.html.erb 里有 javascript_include_tag "application"就可以了
#14 楼 @413472212 不确定,以前看 3.1 的 changelog,rjs 已经被抛弃了。版本对不上真无法前进了。买中文书第 4 版配合 3.0.5 吧,这个版本到 3.2.2 主要是加了 assets pipeline。
#16 楼 @413472212 前几天出了中文了。顺便我在整理勘误,不过因为不是第一次看很可能看不下去= =
<%= javascript_include_tag :defults %>:没问题,是将 public 下的 javascripts 内所有 js 文件加载。 你看你的 contrller 内是否在 respond 之前有个 render 方法调用,我这边就是因为这个!
@Rei ruby_china 这个回复功能是使用 :remote => true,可是提交后是如何显示出刚刚的回复,只能手动刷新后才能显示出来。不明白。。
#23 楼 @longerian 我也只能手动刷新。老外提供了一段代码给我:$("#cart").replaceWith('<%=escape_javascript(render :partial => 'cart', :object=>@cart) %>'); 保存为 add_to_cart.js.erb , <%= javascript_include_tag :defults %> 改为: <%= javascript_include_tag“application” %> 我只能手动刷新才能出现。
29 楼 @rubyqian 还不行吗?我上次做过大概知道原因了!你就是用 jquery 应该也出不来那个动画!因为需要 jquery-ui,但 3.2.2 的 jquery-rails 已经不包含 jquery-ui 了你要自己弄个放进去
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 %>"); 即可。
同样是这个问题,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 效果再次消失