10

我正在阅读 Michael Hartl 的 Rails 教程,在第 12.2.5 节遇到了一个小障碍,我们应该在这里使用 Ajax 创建一个工作按钮。我知道代码是正确的(我直接从书中复制了它并重新输入了三遍)而且我是绿色的。但它实际上不起作用!

通过本教程的这一部分,我们将更改常规表单提交按钮以使用 Ajax,以便整个页面不会“刷新”(实际上,重定向到同一页面),而只是按钮和相应的侧边栏项目更新。问题是按钮不会像我期望的那样在单击时自动重新加载。它会在页面刷新时重新加载。如果我在浏览器中禁用 JS,它会恢复 - 它应该 - 触发重定向并“刷新”整个页面的 HTML 版本。如果您想知道,我已经尝试过刷新页面,并且我已经尝试过 Firefox、Safari 和 Chrome 以及 Incognito 中的 Chrome。我已经关闭并重新启动了 rails 服务器、spork 和 autotest。我重写了所有的代码,然后复制了本书的所有代码。还是一头雾水。

因此,即使测试是绿色的,我的工作功能也不完美。也许我缺少一些东西,你可以帮我找到它吗?也许我错过了一个与 javascreipt 相关的 gem,一个 Ajax gem ......

代码的相关部分:

关系控制器.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) 做 |f| %> <%= f.hidden_​​field :followed_id %>
<%= f.submit "Follow" %> <% end %>

_unfollow.html.erb:

<%= form_for(current_user.relationships.find_by_followed_id(@user),
         :html => { :method => :delete },
         :remote => true) do |f| %>

<% 结束 %>

创建.js.erb

$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')

销毁.js.erb

$("follow_form").update("<%= escape_javascript(render('users/follow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')

我还确保该行包含在 application.html.erb 中

<%= javascript_include_tag :defaults %>

如果您还需要评估情况,请询问,我会及时回复。

TIA

4

5 回答 5

6

您使用的是什么版本的导轨?如果它的 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的注释

于 2012-01-23T16:59:25.697 回答
3

更改<%= javascript_include_tag :defaults %><%= javascript_include_tag 'prototype' %>application.html.erb 文件,这为我解决了这个问题。

见链接:

http://getsatisfaction.com/railstutorial/topics/ajax_follow_button_not_working_in_section_12

于 2011-11-16T14:48:13.083 回答
1

我使用 Rails 3.1.1 并在 Rails 3.0 教程之后遇到了同样的问题。在版本更新中,Rails 已从 Prototype 移出并开始使用 jQuery。为了更正旧版本的 javascript,我必须更新 create/destroy.js.erb。

你可以在第 13 章读到它。它归结为在您的标签 ID 前添加一个“#”,并将“.update”调用替换为“.html”。

于 2011-11-25T15:36:54.210 回答
0

我一直在努力解决同样的问题。我还没有解决方案,但我想我可能能够通过我尝试的一些方法将球向前移动。

最有可能的线索是这个。在试图简化事情时,我试图消除 jQuery 代码本身。为此,我使用了 Safari 的 Inspect Element/scripts 控制台来测试页面上的脚本。

我决定和无害的人一起去

$('title').text("Create")

把它放在 Safari 控制台更改标题。但是,将它放在我的 create.js.erb 和 destroy.js.erb 文件中不起作用(当我单击关注/取消关注按钮时)。我的日志显示正在调用适当的关系/destroy.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)

这是加载的最后一件事。我的关系控制器与上面相同。我的表格与本书相同(但在 haml 中),并且我已将 haml 替换为 hartl 的 github haml 分支上发布的表格。

所以,我的假设是 create.js.erb 和 destory.js.erb 文件正在加载,但由于某种原因没有执行。有谁知道接下来要尝试什么来诊断/解决这个问题?

谢谢,

戴夫

于 2011-05-31T10:35:00.797 回答
0

我最近在 Rails 4 上遇到过这个问题

运行网络服务器,点击关注/取消关注然后返回您的网络服务器日志

查找错误

我有一个渲染错误 ID NIL

因为我已经在代码的末尾更新了关系控制器.erb 中的变量@user,但不是在我定义它的第一行

def create user=User.find(params[:followed_id]) current_user.follow(user) respond_to do |format| format.html { redirect_to @user } format.js end end

固定

def create @user=User.find(params[:followed_id]) current_user.follow(@user) respond_to do |format| format.html { redirect_to @user } format.js end end

再次销毁 - 所以用 @user 更新用户的所有实例

干杯

于 2016-02-10T18:27:20.253 回答