Javascript / jQuery中的Access Rails全局常量

Access Rails global constant in Javascript / jQuery

本文关键字:Rails 全局 常量 Access 中的 jQuery Javascript      更新时间:2023-09-26

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

Rails

constants.rb (initializer file)
DEFAULT_REPLY = "Add a reply..."
Rails

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中提取值。

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

你的javascript文件名应该是reply.js.erb。

当前,您的.js文件没有通过rails运行,而是静态地提供服务。这就是为什么当您在字符串周围加上引号时,它会输出字符串'<%= h DEFAULT_REPLY %>'而不是正确的文本。

我强烈建议不要使用这种方法但是我认为你在这里混淆了两件事。

假设reply.jspublic/javascripts/reply.js中,这是一个由服务器提供的静态JS文件。你不能在这里放任何动态("服务器端")代码,因为文件不会以任何方式求值,只是静态传递回。

如果你想在你的文件中使用一个全局JS变量,你需要在你的layout文件app/views/layouts/application.html.erb或在你的动作文件(index.html.erb, show.html.erb等)中分配它。

任何ERB文件在返回之前都会被求值,因此您可以将

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

layout文件的<%= yield %>语句上面。

再一次,我强烈建议不要使用这种方法,但是如果这就是你需要的原因,我认为这将解决它。

听起来你的视图模板命名不正确,它以。html.erb结尾吗?如果没有,它将不会计算您粘贴的ERB片段。

一旦你解决了这个问题,你就可以用下面的ERB代码嵌入你想要的东西:

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

如果它是rails 3应用程序,为什么要使用这种语法?试一试:

var default_reply = <%= DEFAULT_REPLY %>;