2011-05-03 33 views
12
  • 如何在haml中運行JavaScript內部的ruby代碼?
  • ,如果我在我的例子中使用var = #{message}我得到undefined local variable or method message
  • 當我移動- message = 'it works'上述:javascript一切正常

我想運行迭代.each:javascript。查看最後一段代碼示例,瞭解我在最終的JavaScript代碼中需要的內容。在哪裏我需要循環幾個ruby變量(或散列哈希散列?)來獲得這個。數據(='基礎')可以有少量元素。它可以有幾個要素等如何在JavaScript定義中運行haml中的ruby?

所以這HAML代碼孩子

%html 
    %head 
    :javascript 
     $(document).ready(function() { 
     - message = 'it works' 
      var = message 

     }); 
%body 
    - message2 = 'hi' 
    = message2 
    %div{:id =>"jstree"} 

給了我這個網站碼

<html> 
    <head> 
    <script type='text/javascript'> 
     //<![CDATA[ 
     $(document).ready(function() { 
      - message = 'hi' 
      var = message 

     }); 
     //]]> 
    </script> 
    </head> 
    <body> 
    hi 
    <div id='jstree'></div> 
    </body> 
</html> 

最終的javascript代碼我想生產使用HAML是JavaScript變量

var data = [{ 
     data: "basics", 
     attr: {}, 
     children: [ 
     {data: "login", attr: {run: "run"}, 
      children: [     
      {data: "login", attr: {}} 
      ] 
     } , 
     {data: "Academic Year", attr: {run: "run"}, 
      children: [     
      {data: "login", attr: {}}, 
      {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}} 
      ] 

     } 
     ] 
     }]; 
+0

這個問題不容易理解。你說你想運行'each',但是你不會顯示在哪裏或如何。我不確定在你的腳本塊與你的問題有關之前如何設置'message'變量。 **你有什麼Ruby變量,你想要什麼作爲輸出?** – Phrogz 2011-05-03 02:58:06

+1

可能的重複:[是否有一種方法可以在Haml的JavaScript區域內使用Ruby循環?](http:// stackoverflow。COM /問題/ 2962119/IS-有-A-方式使用的-A-紅寶石 - 環 - 內 - 的-hamls JavaScript的區域/ 5864657#5864657)注入變量值插入JavaScript和HAML的 – Phrogz 2011-05-03 03:11:35

+0

可能重複在回報率(http://stackoverflow.com/questions/4708369/injecting-variable-values-into-javascript-and-haml-in-ror) – 2014-06-27 10:04:05

回答

29

首先Ruby代碼,讓我們回顧一下你似乎知道:

  1. 紅寶石需要您在使用它們之前定義的局部變量。
  2. 您可以使用- ...在過濾器外部的線上運行Ruby代碼。
  3. 您可以使用#{...}標記在過濾器內插入Ruby代碼。

你說你想運行each,但想必你希望從這個輸出;自#{...}結果變成一個字符串,並把你的代碼,你真正想要的(可能)是map

%html 
    %head 
    :javascript 
     var foo = []; 
     #{ 
     limit = rand(4)+3 
     array = (0..limit).to_a 
     array.map{ |i| "foo[#{i}] = #{rand(12)};" }.join ' ' 
     } 
     console.log(foo.length); 
    %body 

運行上面的代碼中給出了這樣的輸出:

<html> 
    <head> 
    <script type='text/javascript'> 
     //<![CDATA[ 
     var foo = []; 
     foo[0] = 2; foo[1] = 0; foo[2] = 11; foo[3] = 8; foo[4] = 0; foo[5] = 1; 
     //]]> 
    </script> 
    <body></body> 
    </head> 
</html> 

如您所見,大塊#{...}塊(可能跨越多行)運行任意的Ruby代碼。最後一個表達式(在此例中爲map{...}.join)的結果被轉換爲字符串並放置在輸出中。

+0

,所以我可以做一些更復雜的像我的最後一個代碼示例?整個'var data'? – Radek 2011-05-03 04:40:49

+0

@Radek是的,你可以產生任何你想要的輸出。產生這樣一個大字面的最簡單的方法是首先要求Ruby中的JSON庫需要「json」,然後創建一個包含所有你需要的子結構的Hash的Ruby數組,然後簡單地使用'var data = #{ruby_variable.to_json};'...但我們已經在[您的其他問題]中介紹了這一點(http://stackoverflow.com/questions/5812789/what-is-the-hash-structure-to-produce-json )。 – Phrogz 2011-05-03 12:34:38

2

The haml documentation for filters states that you can使用插值#{}

- flavor = "raspberry" 
#content 
    :textile 
    I *really* prefer _#{h flavor}_ jam.