2013-05-20 50 views
0

我是新来的.js.erb文件,我使用它们是因为我需要构建需要Ruby变量的Javascript字符串。.JS.ERB无法识别变量

这是我的代码。

pusher.js.erb

var pusher = new Pusher(PUSHER KEY); 
var myChannel = pusher.subscribe('job_channel'); 
$(document).ready(function() { 
    myChannel.bind('job_added', function(data) { 
     addJob(data) 
    }); 

    function addJob(data) { 
     <% job = JSON.parse(data) %> 
     var new_job = "HELLO <%= job.id %>"; 
     $('.job_list').append(new_job) 
    }; 

}); 

data存放名为job我转换为JSON Ruby对象。我想将该JSON对象转换回Ruby对象并使用它的属性来构造一个Javascript字符串。我知道在这个例子中我可以简单地使用data["id"],但这只是示例代码,我需要更多更复杂的Ruby东西来进入该字符串。

当我尝试启动服务器,并加载一个网页,我收到此错误:

undefined local variable or method `data' for #<#:0x007ffe07cb7e58> (in /PATH/javascripts/pusher.js.erb)

app/assets/javascripts/pusher.js.erb:17:in `block in singletonclass' 
app/assets/javascripts/pusher.js.erb:65530:in `instance_eval' 
app/assets/javascripts/pusher.js.erb:65530:in `singletonclass' 
app/assets/javascripts/pusher.js.erb:65528:in `__tilt_70364478302900' 
app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb___1231815935649534974_70364476328360' 

回答

1

ERB通过文本和执行操作,或者基于Ruby代码写出文字它看到里面某些转义序列。您有雇员再培训局会处理两个转义序列:

<% job = JSON.parse(data) %> 
var new_job = "HELLO <%= job.id %>"; 

数据没有ERB /红宝石范围,这就是为什么你看到的上面的错误被定义。看起来你可能会得到与JavaScript代码混合在一起的ERB/ruby​​代码。他们互相独立运作。

+0

这是否意味着命名你的文件something.js.erb不一定允许你访问你的js文件中的控制器变量? – ahnbizcad

+0

不,我只是想说,你必须独立思考ERB传递和由此产生的JavaScript。再培训局正在操作红宝石土地上的文字,而所产生的JavaScript将与ERB操作产生的任何文本一起工作。我认为这个问题的错误是认为数据变量是在红宝石/ ERB土地上定义的,当它没有时“T。 – Puhlze