我正在阅读Michael Hartl的Rails教程,在§12.2.5中遇到了一个小问题,我们应该在那里用Ajax创建一个工作按钮。我知道代码是正确的(我直接从书中复制了它,并重新输入了三次),我是绿色的。但它实际上不起作用!
在本教程的这一部分中,我们将更改常规表单提交按钮以使用Ajax,这样整个页面就不会"刷新"(实际上,重定向到同一页面),而只是更新按钮和相应的侧边栏项目。问题是按钮并没有像我所期望的那样在点击时自动重新加载。它确实会在页面刷新时重新加载。如果我在浏览器中禁用JS,它会恢复到HTML版本,从而触发重定向并"刷新"整个页面。如果你想知道的话,我试过刷新页面,也试过Firefox、Safari、Chrome和Chrome。我已经关闭并重新启动了rails服务器、spork和自动测试。我重写了所有的代码,然后复制了这本书的所有代码。仍然被难住了。
因此,即使测试是绿色的,我也有一个不完美的工作功能。也许我缺了什么,你可以帮我找吗?也许我错过了一个与javascreipt相关的gem,一个Ajax gem。。。
代码的相关部分:
relationships_controller.erb:
class RelationshipsController < ApplicationController
before_filter :authenticate
def create
@user = User.find(params[:relationship][:followed_id])
current_user.follow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
结束
def destroy
@user = Relationship.find(params[:id]).followed
current_user.unfollow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
end
_follow.html.erb:
<%=form_for(current_user.relationships。build(:followed_id=>@user.id),:remote=>true)do|f|%><%=f.隐藏字段:followed_id%>
<%=f.提交"关注"%><%结束%>
_unfollow.html.erb:
<%= form_for(current_user.relationships.find_by_followed_id(@user),
:html => { :method => :delete },
:remote => true) do |f| %>
<%结束%>
create.js.erb
$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')
destroy.js.erb
$("follow_form").update("<%= escape_javascript(render('users/follow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')
我还确保这一行包含在application.html.erb 中
<%= javascript_include_tag :defaults %>
如果你还需要评估情况,请询问,我会提供最新情况。
TIA
您使用的是什么版本的导轨?如果是3.1,你必须更改
create.js.erb到:
$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')
和destroy.js.erb到:
$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')
(注意额外的#)在教程的最后一章,更改为rails 3.1 的注意事项
在application.html.erb文件中将<%= javascript_include_tag :defaults %>
更改为<%= javascript_include_tag 'prototype' %>
,这为我解决了问题
参见链接:
http://getsatisfaction.com/railstutorial/topics/ajax_follow_button_not_working_in_section_12
I'使用Rails3.1.1,在Rails3.0教程之后也出现了同样的问题。在版本更新中,Rails已经脱离了Prototype,开始使用jQuery。为了纠正旧版本的javascript,我不得不更新create/dedestroy.js.erb.
你可以在第13章中读到。归根结底,就是在标签id前面添加一个"#",并将".update"调用替换为".html".
我一直在思考同样的问题。我还没有一个解决方案,但我认为我可以通过我所尝试的一些方法将球向前推进。
最有可能的线索是这个。在试图简化事情的过程中,我试图消除jQuery代码本身。为此,我使用Safari的Inspect Element/scripts控制台来测试页面上的脚本。
我决定使用无害的
$('title').text("Create")
放这是Safari控制台更改的标题。然而,将它放在我的create.js.erb和destroy.js.erb文件中是不起作用的(当我单击follow/unfollow按钮时)。我的日志显示,正在调用适当的relationship/dedestroy.js.erb视图,但元素不会刷新(页面也不会重新加载)。
Rendered layouts/_stylesheets.haml (3.3ms)
Rendered layouts/_header.haml (6.1ms)
Rendered layouts/_footer.haml (3.8ms)
Rendered relationships/destroy.js.erb within layouts/application (34.8ms)
Completed 200 OK in 132ms (Views: 39.0ms | ActiveRecord: 1.3ms)
这是最后要加载的东西。我的relationships_controller和上面一样。我的表格和这本书一样(但在haml中),我用发布在hartl的github haml分支上的表格代替了haml。
因此,我的假设是create.js.erb和destory.js.erg文件正在加载,但由于某种原因没有执行。有人知道下一步该怎么诊断/解决这个问题吗?
谢谢,
Dave
我最近在Rails 4 中遇到了这个问题
运行Web服务器,单击follow/unflow,然后返回到您的Web服务器日志
查找错误
我有一个渲染错误ID NIL
因为我在relationships_controller.erb中更新了变量@user作为代码的末尾,但没有在我定义它的第一行
def创建user=用户.find(params[:followed_id])current_user.flow(用户)responsed_to|格式|format.html{redirect_to@user}format.js终止结束
使用修复
def创建@user=用户.find(params[:followed_id])current_user.flow(@user)responsed_to|格式|format.html{redirect_to@user}format.js终止结束
同样适用于destroy-因此使用@user更新用户的所有实例
欢呼