2013-03-15 23 views
0

我目前使用這在我的控制返回JS在Rails的響應,並讓它執行不

respond_to do |format| 
    format.html { render :js => alert('example') } 
end 

這在我的application.js

$(document).ajaxSuccess(function(event, xhr, settings) { 
    if (settings.url == '/example') { 
    eval(xhr.responseText) 
    } else if (settings.url.match(/[\/example\/\d]+$/)) { 
    eval(xhr.responseText) 
    loadComplete() 
    } else { 
    (etc) 
    } 
}) 

要將.js.erb文件在ajax響應中返回JS並讓瀏覽器執行它。我這樣做是爲了避免必須編寫一個新的.js.erb文件來適應每個可能的響應。

有沒有更好的方法來做到這一點?我認爲減少文件數量會很好,但是必須在ajaxSuccess settings.url上使用正則表達式分離JS響應。

+0

我不明白。您想做什麼? – beck03076 2013-03-15 22:38:50

+0

我有一個管理部分頁面,可以添加和刪除部分。部分創建和刪除都很好,但我希望ajax響應可以在管理部分頁面上創建或刪除元素,而無需刷新。我認爲使用jQuery的.load()作爲partial會更好。 – Archonic 2013-03-16 22:56:36

+0

請注意,考慮到$(document).ajaxSuccess在所有**成功的遠程鏈接上觸發,'eval(xhr.responseText)'打開執行不需要的動作的機會。 – Archonic 2013-05-07 22:45:31

回答

0

做到這一點的更好的方法是遵循約定,並製作js.erb文件。他們會自動執行假定的操作。例如,對於創造一個create.js.erb部分響應:

$('#placeholder-<%= @subsection[:sortlabel] %>').replaceWith("<%= escape_javascript render :partial => 'section_item', :locals => {:section=>@subsection} %>") 

而且destroy.js.erb的內容:

$('li#menu-item-<%= @section.id %>').remove(); 

控制器的響應隱藏這些東西拿走可能是得心應手避免創建(另一個)文件,但應用程序的可維護性會受到影響。