2011-06-27 43 views
3

我有一個奇怪的情況,但在這裏它是:HAML/JavaScript的/ ERB逃避

# a HAML file 
:javascript 
    #{ if session[:view].blank? 
     "$.ajax({ 
      url: 'url_for params.merge(:action => 'index')', 
      dataType: 'script'})" 
    else 
     "$.ajax({ 
      url: 'url_for companies_url', 
      dataType: 'script'})" 
    end } 

所以這基本上是中嵌套紅寶石的JavaScript,JavaScript的裏面,裏面HAML。它不起作用,因爲我的報價嵌套不當。

  1. 我想有一個更好的方法來做到這一點。有什麼想法嗎?
  2. 上面發生的ajax會將當前視圖中的部分內容呈現出來,而會更改會話變量。我如何更新這個JavaScript,以便在新會話[:view]中正確運行?
+0

這不行? 'url:'url_for params.merge(:action => \'index \')',' – mplungjan

回答

3

使用ERB和輔助方法。這是一個更清潔:

# foo_helper.rb (or whichever helper is applicable for this view) 
module FooHelper 
    def url_for_ajax_call 
    if session[:view].blank? 
     url_for(params.merge(:action => 'index')) 
    else 
     # url_for(companies_url) is redundant 
     companies_url 
    end 
    end 
end 

# view.js.erb 
$.ajax({ url: <%= url_for_ajax_call %>, dataType: 'script' }) 
+0

這真棒,它與我的嵌套問題很好地工作。你知道我可以如何處理#2,即如何重新評估這個javascript/erb的ajax響應?當然,控制器已經改變了session [:view]。 – sscirrus

2

在我看來,你不需要切換到ERB,但輔助方法是好的。我會將網址放入頁面呈現的標記中。通常我在錨標記的data-href屬性中爲不顯眼的javascript執行此操作。例如:

= link_to "Link to index view", url_for(params.merge(:action => "index")), { 'data-href' => url_for_ajax_call } 

然後:

$.ajax({ url: $(element).data('href'), dataType: 'script' }) 

然後所有的部分需要做的是重新渲染,這將重新生成正確的url_for_ajax_call的的link_to。

很顯然,這種方式需要更多的工作,因爲您需要將click event handler添加到鏈接中,並且您需要停止實際發生的鏈接點擊(http://api.jquery.com/event.preventDefault/)。但是沒有必要爲單個文件切換到ERB,您可以處理關閉JavaScript的用戶,並解決您的第二個問題。

+0

這個很有意思,謝謝你的回答。 +1 – sscirrus