在Javascript / jQuery中访问Rails全局常量

时间:2011-09-02 16:59:03

标签: javascript jquery ruby-on-rails ruby-on-rails-3

我的设置:Rails 3.0.9,Ruby 1.9.2,jQuery 1.6.2

滑轨

constants.rb (initializer file)

DEFAULT_REPLY = "Add a reply..."

滑轨

index.html.erb 

<%= javascript_include_tag 'reply' %>
...(rest of view code)...

reply.js

$(function() {
 var default_reply = <%= h DEFAULT_REPLY -%>;
 ...(rest of jQuery code)...
});

这会引发错误Uncaught SyntaxError:Unexpected token %=,我尝试将其括在var default_reply = '<%= h DEFAULT_REPLY -%>'之类的引号中,并按原样输出值,这意味着default_value的值为<%= h DEFAULT_REPLY -%>'显然不是我的意图。我究竟做错了什么?

修改 鉴于反馈,我已经重新考虑并且现在使用局部变量和jQuery在页面加载时从textarea中提取值。

4 个答案:

答案 0 :(得分:2)

您需要将.erb添加到.js文件的末尾,并在字符串周围添加引号。

您的javascript文件的名称应为reply.js.erb。

目前,您的.js文件未通过rails运行,并且正在静态提供。这就是为什么当你在字符串周围加上引号时,它会输出字符串'&lt;%= h DEFAULT_REPLY%&gt;'而不是正确的文字。

答案 1 :(得分:2)

我强烈反对这种做法,但我认为你在这里混淆了两件事。

假设reply.js位于public/javascripts/reply.js,这是一个由服务器提供的静态JS文件。您不能在此处放置任何动态(“服务器端”)代码,因为文件未以任何方式进行评估,只是静态传回。

如果您希望在文件中使用全局JS变量,则需要在layout文件app/views/layouts/application.html.erb或操作文件(index.html.erb,{show.html.erb中进行分配。 {1}}等。)

在返回之前评估任何ERB文件,因此您可以放置​​

<script type='text/javascript'>
  $(function() {
   var default_reply = "<%= escape_javascript DEFAULT_REPLY %>";
  });
</script>

高于<%= yield %>文件的layout声明。

同样,我强烈建议反对这种做法,但如果这就是你需要的原因,我想这会解决它。

答案 2 :(得分:1)

听起来你错误地命名了你的视图模板,它是以.html.erb结尾吗?如果没有,它将不会评估您粘贴的ERB片段。

修复后,您可以使用以下ERB代码嵌入您想要的内容:

$(function() {
 var default_reply = "<%= h DEFAULT_REPLY -%>";
 ...
});

答案 3 :(得分:-2)

如果是rails 3 App你为什么要使用这种语法?尝试:

var default_reply = <%= DEFAULT_REPLY %>;