2012-05-26 24 views
0

我有以下HAML代碼:導軌3使得Ajax使用jquery和執行.js.erb

%input{:value => "", :type => "button",:class => "SendBtn", :onclick => "$.get('#{send_path}',{parameter:$('#parameter').val()}); "} 

該輸入執行在控制器的事件。

// This is my controller 
def send 

    if request.xhr? 
     // do stuff 
    end 
end 

但我的js代碼在相應的.js.erb文件沒有被執行。它作爲獲取請求的響應返回。

// send.js.erb 
alert('hello'); 

rails方式如何執行此代碼?

+2

它不是一個回答你的問題,所以我會離開它作爲一個評論:你知道你正在使用舊techniches? 1)UJS:不要將事件添加到html,將它們附加到JS。 2)不要使用'request.xhr?'這種古老的方式,使用'respond_to do | format | ...'。 3)(不是每個人都會同意)不要從動作發送JS,發送JSON並讓客戶端的JS代碼管理它。 – tokland

回答

5

你的問題不是Rails相關的,它是jQuery。使用get方法,您只是獲取更多或更少的純文本。這不會被執行。你可以在文字上做一個eval,但有一個更好的方法。使用getScript method from jQuery。這將獲取並執行您的代碼。

作爲一個側面說明,但是也有一些困擾我在你的代碼的兩件事情:

  1. 您正在使用內嵌的JavaScript。請嘗試通過爲您的發送路徑使用data-屬性(如data: { sendPath: send_path }),並在application.js文件中使用$(yourInput).data('sendPath')來檢索它。
  2. 從我個人的角度來看,我不喜歡在ERB模板中執行JavaScript代碼。我發現這會碎片化我的應用的前端邏輯。對我來說,將邏輯放在.js文件中並通過JSON與服務器進行通信會更好。
+0

另一個鏈接可能會幫助你:http://www.alfajango.com/blog/rails-3-remote-links-and-forms/ – topek

+0

我會試試看。感謝您的回答。這不是我的代碼= P,這是遺留代碼,我試圖改進它....感謝您的意見。 – Tony

+0

對於數字2 ....我已經讀過,這是ajax請求的最佳做法...我在我的js.erb中沒有真正的邏輯,它只是顯示錯誤/成功消息。你怎麼看待這件事? – Tony

1

由於@topek說,你必須使用$.getScript。此外,在您的情況下,更好的方法是使用button_to:remote => true屬性,而不是普通的input

<%= button_to "Do Something", 
       { :controller => :somecontroller, :action=> :something }, 
       { :remote => true } 
%> 

此外,您可以傳遞屬性到button_to(但您有添加參數到您的路線定義)。

<%= button_to "Do Something", 
     { :controller => :somecontroller, :action=> :something, :param => @object.id }, 
     { :remote => true } %> 

這裏去文檔button_tohttp://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to

+0

我會在幾天後嘗試。謝謝。 – Tony