【问题标题】:ruby vs js string concatenation in railsrails中的ruby vs js字符串连接
【发布时间】:2011-07-05 16:54:55
【问题描述】:

所以在我的 show.html.erb 文件中打开我拥有的控制器

<% content_for :head do %>
<script type="text/javascript"> 
var filepath= "/flexpaper/" + <%=  @exam.filename.to_s %> + ".swf"

        var flashvars = { 
              SwfFile : escape(filepath), ....

现在这似乎是我使用的解决方法,但是当我尝试以相反的方式实现相同的结果时,如下所示

<% content_for :head do %>
    <script type="text/javascript"> 
    var filepath= <%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>

            var flashvars = { 
                  SwfFile : escape(filepath), ....

即在 ruby​​ 而不是 javascript 中生成文件路径 我收到未定义的文件路径错误。 现在我明白这是因为逃逸,因为它没有将文件路径作为字符串 i.r "stuff.." 而不是类似的东西.. 所以逃逸错误出来了。 但我不明白为什么?有什么想法吗?

P.s- 还有对 UJS 风格组织的任何建议。我有其他所有 js 驻留在其他文件的某个地方,并根据需要包含在标题中,除了这个有点动态的。 我不能在包含的 js 文件中包含 ruby​​ 代码,也不想像 ryan bates railscast 那样使用 javascript 控制器来生成这个小脚本。所以任何其他简单的解决方案。

【问题讨论】:

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


    【解决方案1】:

    基本上,您在第二个版本的 javascript 中缺少引号。 ruby 运行后,生成的页面包含一个带有纯 javascript 的脚本标记。那个 javascript 看起来像这样:

    var filepath= /flexpaper/some_exam.swf
        var flashvars = { 
          SwfFile : escape(filepath), ....
    

    请注意,您正在为文件路径变量赋值,但它没有被引号括起来。它不是有效的 JavaScript。如果你这样修复它,它应该可以工作:

    <% content_for :head do %>
      <script type="text/javascript"> 
        var filepath= "<%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>";
        var flashvars = { 
           SwfFile : escape(filepath), ....
    

    在此过程中,我添加了一个分号并修正了缩进 - 您会发现正确缩进您的 javascript 代码使其更容易调试几个数量级。该 ruby​​ 代码将生成如下所示的 javascript:

      <script type="text/javascript"> 
        var filepath= "/flexpaper/some_exam.swf";
        var flashvars = { 
           SwfFile : escape(filepath), ....
    

    发现此类错误的一个技巧是在浏览器中查看源代码,并仔细查看正在生成的 javascript。

    【讨论】:

      【解决方案2】:

      我从您的代码中看到了几个错误,在这两种解决方案中,您都缺少将使某些文本成为字符串的引号。在第一个中,您可以这样做:

      <% content_for :head do %>
        <script type="text/javascript"> 
          var filepath= "/flexpaper/<%=  @exam.filename.to_s %>.swf"
      
          var flashvars = { 
                SwfFile : escape(filepath), ....
      

      在第二个中,您缺少整个字符串的引号

      <% content_for :head do %>
        <script type="text/javascript"> 
          var filepath= "<%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>"
      
              var flashvars = { 
                    SwfFile : escape(filepath), ....
      

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多