javascript - Rails 3.1 - JS - *.js.erb 中的 Socket.io-emit 未执行并阻止执行 jQuery-Function

标签 javascript ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 socket.io

我想在我的 Rails 项目中使用 node.js 来提供异步 io。我不想使用 juggernaut、faye 或类似的东西,因为我需要与 web 套接字、服务器发送的事件和 spdy 的干净连接,没有其他选择。我第一次尝试使用 node.js 现在是使用 Socket.io,只是为了使用 JavaScript 将数据提供给 node.js 模块。但它根本不起作用。

我的 application.js 看起来像这样:

// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

window.socket = io.connect('http://localhost:8080/');

io 的要求已正确加载到我的 application.html.erb 中:

 <%= javascript_include_tag "application", "http://localhost:8080/socket.io/socket.io.js" %>

现在我想在 create.js.erb 中使用套接字发出发送给所有监听客户端的事件:

$(function() {
  window.socket.emit('message', <%= @message =>);
};
$("#new_article")[0].reset();

消息以这种方式在 ArticlesCrontroller 中创建:

def create
  @article = current_user.articles.build(params[:article])
  if @article.save
    msg = {:data => @article.to_json}
    @message = msg.to_json
  end
end

我在另一个名为 index.js.erb 的 View 中以这种方式收听此事件:

$(function() {
  window.socket.on('message', function (msg) {
    $("#articles").prepend(<%= escape_javascript render(Article.new.from_json(msg.data)) %>);
  });
});

Socket.io 看起来像这样:

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function (socket) {
  socket.on('message', function () { });
  socket.on('disconnect', function () { });
});

并且似乎工作正常,因为它告诉我它是如何服务请求的 js 文件的:

info  - socket.io started
debug - served static /socket.io.js

但是它根本不起作用,尽管 create.js.erb 没有错误地呈现:

Rendered articles/create.js.erb (0.5ms)
Completed 200 OK in 268ms (Views: 70.0ms | ActiveRecord: 14.6ms)

即使是用于重置表单的 jQuery 函数也没有执行,如果不尝试发出 socket 事件就可以工作。文章被正确保存到数据库中,所以这不是问题所在。谁能告诉我问题出在哪里?

更新:我通过使用 chrome 的 JavaScript 调试器发现,问题始于 application.js 中 window.socket 的定义。错误代码是:

Uncaught ReferenceError: io is not defined
  (anonymous function)

但是 io 是在我加载到我的 application.html.erb 中的 socket.io.js 文件中定义的。我以这种方式为 application.js 做了一个解决方法:

$.getScript('http://localhost:8080/socket.io/socket.io.js', function(){
  window.socket = io.connect('http://localhost:8080/');
});

现在的问题是:为什么我必须以这种方式获取脚本,尽管它是在 application.html.erb 中加载的?但是尽管有这种解决方法,create.js.erb 仍然无法正常工作。我会在稍微睡一觉后尝试解决这个问题。

最佳答案

我通常在相关 list 中包含依赖项(在本例中为 application.js)。

Rails 知道许多不同的 Assets 路径,所有这些路径都在编译之前进行检查。我倾向于将(例如 socket.io.js)放在 vendor/assets/javascripts 中,并在 list 中添加一行,如下所示:

//= require jquery
//= require jquery_ujs
//= require socket.io
//= require_tree .

关于javascript - Rails 3.1 - JS - *.js.erb 中的 Socket.io-emit 未执行并阻止执行 jQuery-Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551630/

相关文章:

javascript - 这个括号序列语法在 JS 中叫什么?

javascript - 在html页面中从sqlite收取数据(addon firefox)

javascript - 元素的背景图像的修改频率是否有限制?

ruby-on-rails - 在 Mac 上安装 Ruby & Rails

ruby-on-rails-3 - Rails 3 CMS + 博客想要适应现有网站。不显眼且轻巧

ruby-on-rails-3 - 当有多个关联时,我应该如何编写ActiveRecord?

javascript - 使用鼠标悬停调用函数。 (不同的选择)

ruby-on-rails - 为什么这个查询在 Heroku 上不起作用?

ruby-on-rails - 如何在 ruby​​ on rails 中将用户上传的图片转换为 webp

ruby - 使用 ruby​​ 修剪歌曲