除非被调用,否则不要在erb中运行JS

时间:2013-02-24 15:47:27

标签: javascript ruby-on-rails

我有一个带有ajax GET的页面到ruby函数。 Get请求应返回变量@player。 当ajax是“成功”时,它应该调用函数popPools

$.ajax({
  type: "GET",
  data: { faceid : response.id },
  url: "/pool/mMypools2",
  success: popPools()
  })


function popPools(){
  $("<%= content_tag(:p, @player[0].id) %>"
  ).appendTo(document.getElementById("asd"));}

我的问题是,在ajax有机会从mMypools响应中获取新变量之前,会自动调用popPools函数。

error:
Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

因为onload @player什么都没包含。

谢谢

2 个答案:

答案 0 :(得分:0)

popPools

的末尾删除括号
$.ajax({
  type: "GET",
  data: { faceid : response.id },
  url: "/pool/mMypools2",
  success: popPools
  })

您将popPools函数的结果作为success的值而不是函数本身传递。

答案 1 :(得分:0)

听起来你在响应模板中试图做太多。 Ajax代码确实属于控制器级别,因为它试图从应用程序中获取数据。模板应该保持“哑”并只响应传递给它的变量。

要解决此问题,我会将文件的顶部完全移出响应模板。在控制器级别正确加载@player后,继续进行响应。哦,不要忘记Javascript转义生成的HTML或任何返回content_tag函数的引号都会破坏jQuery。

file.js.erb:

$(
  "<%= j content_tag(:p, @player[0].id) %>"
 ).appendTo(document.getElementById("asd"));}

我希望这个建议有所帮助。