2010-04-14 26 views
53

我有一個向表單添加新字段的jQuery腳本,該字段包含數組中的動態信息。問題是,我無法弄清楚如何添加一個array.each來填充javascript內選擇字段的選項,而不會破壞HAML縮進並導致錯誤。HAML中Javascript內的Ruby方法

這裏是不工作,我的最好的嘗試:

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>); 
)}; 

還與試了一下:沒有運氣的JavaScript過濾器。

+0

謝謝,看起來像某人爲我修復了Markdown縮進問題。 – Josh 2010-04-14 21:11:35

回答

96

通常情況下,如果haml中存在某種痛苦,這意味着您應該將棘手的位重構爲助手或部分並調用它。

// some_helper.rb 
def new_snazzy_select_tag(options = []) 
    select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } 
end 

此外,你應該使用:javascript過濾器處理JavaScript,因爲它將把它放在你的腳本標記,並允許縮進。

最後,您可以在haml中的任何位置使用#{ruby_expression},包括:javascript過濾器,當您需要將ruby表達式的結果輸出到非直接包含html元素的位置時,非常方便。

// some_view.html.haml 
:javascript 
    $('#mylink').click(function() { 
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); 
    }; 
+0

我對web應用程序開發很新,我從來沒有想過使用助手。我一直保持我的代碼非常接近MVC,但總是想知道如何繞過視圖中需要的循環。這應該很好。謝謝你的答案。 – Josh 2010-04-14 22:18:21

+4

助手通常在視圖和控制器之間。他們不應該改變任何服務器端狀態,並且只是在那裏*用惡劣的視圖邏輯來幫助*。 Ruby中的觀點應該儘可能少,以便清晰和可維護。幫手幫忙。 – 2010-04-15 08:57:35

+6

TL; DR ...?使用#{ruby_expression}謝謝Alex。 – umassthrower 2012-08-06 05:55:09

8

試試這個,它應該工作(我所做的就是在第五行中刪除一個空格,並添加第六關閉的引號):

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - @myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>'); 
)}; 

但是,假設你正在運行這與一個紅寶石腳本或框架的種類,爲什麼不只是在模板之外?這可能是最合適的。在rails/sinatra和其他框架中,可以使用助手方法來執行此操作。如果你看哈姆參考,他們實際上不鼓勵使用-來評估紅寶石。

+0

我在沒有語法高亮顯示的情況下從內存中鍵入代碼,看起來像我有幾個錯誤。我目前無法測試,但我相信這仍然會失敗。我要去幫助者的路線,我以前沒有想過。謝謝。 – Josh 2010-04-14 22:18:47

+0

我之前測試過我在快速的sinatra應用程序中放入我的答案的代碼,它似乎很好地工作(沒有haml錯誤)。你確定錯誤不在其他地方?以下是我得到的生成輸出,包含隨機選項ID和名稱:http://pastie.org/920686 – ehsanul 2010-04-15 04:43:37