這裏的問題是,你不能在過濾器中正常使用HAML功能(例如:javascript
)。然而,過濾器中的文本會受到正常的ruby字符串插值的影響,即#{}
內的任何內容都將作爲Ruby代碼執行。
所以讓你的例子來工作的一個方法是這樣的:
:javascript
var names = new Array;
#{js = ""
User.all.each {|u| js << "names.push(#{u})\n" }
js}
這是相當混亂,雖然,整理一下的方法是將其移動到一個幫手。助手只是一個在渲染期間處於範圍內的方法(因此可以在haml文件中調用它),並生成一些文本以包含在生成的頁面中。
在這種情況下,您正在生成JavaScript,但JavaScript只是文本,所以這裏沒有問題。輔助方法可能是這個樣子:
def js_array(name, array)
js = "var #{name} = new Array();\n"
array.each do |i|
js << "#{name}.push(#{i})\n"
end
js
end
(或者你可以創建一個文本JavaScript數組:如果您首選
def js_array(name, array)
js = "var #{name} = ["
js << array.collect{|i| "\"#{i}\""}.join(",")
js << "]"
js
end
。)
接下來,就這種方法去?在Sinatra中,您使用'helpers` method定義了輔助方法。在此塊中定義的任何方法將你的意見是可用:
helpers do
def js_array(name, array)
js = "var #{name} = new Array();\n"
array.each do |i|
js << "#{name}.push(#{i})\n"
end
js
end
end
有了這個地方,那麼你可以做
:javascript
#{js_array("names", User.all)}
在HAML生成您的JavaScript數組。請注意,你仍然需要#{}
,這樣ruby代碼纔會被執行,現在只需要在大括號之間調用一個方法。:javascript
過濾器會將該塊包裝在<script>
和<![CDATA[
標籤中,並且幫助程序將創建您想要的實際JavaScript。
還有一件事:在你的例子中,數組是User.all
,它看起來像是對activerecord的調用或類似的東西,在這種情況下,你可能沒有一個字符串數組,但是可能沒有給出結果的其他對象想。您可能需要做一些事情,如:
:javascript
#{js_array("names", User.all.collect(&:pretty_name)}
(其中pretty_name
是User
對象打印返回名字的方法),或者改變輔助方法來提取您要使用的字符串。
太棒了,謝謝馬特!我將其標記爲答案,因爲它強調了如何使用助手來生成與haml一起使用的javascript。 – Bryan 2011-05-19 19:57:06