按钮在 Ajax 中未更新 - Rails 教程 3 §12.2.5



我正在阅读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更新用户的所有实例

欢呼

相关内容

  • 没有找到相关文章

最新更新