2016-03-21 58 views
0

我有一個new.html.erb文件這個腳本,在底部,在腳本標籤:事件觸發後,使用Ruby變量

$('div #mainPhotoDropzone').dropzone({ 
     url: "/photos?post_id=" + $("#post_form").data('post-id'), 
     complete: function(file){ 
      var url = "<%= @post.photos.first.file.path %>"; 
      $.get(url, function(data){ 
      $('#mainPhotoDropzone').attr('style', "background-image: url('" + data.main_photo + "')"); 
      }) 
     } 

然而,@post.photos.first.file.path還不能在頁面加載存在,所以我有一個錯誤。由於我在complete事件(並在此特定時間存在)上調用此變量,我應該將此腳本放在另一個文件中,並要求它在我的new.html.erb中才能生效?我必須將它放在js.erb文件中嗎?

更一般地說,如何在我的javascript頁面加載後使用erb而不解釋它?

+0

在服務器上評估ruby的東西,而JavaScript在客戶端上運行。如果您想在發生客戶端事件時執行涉及服務器的事情,則必須向服務器發出HTTP請求(ajax)。 – Pointy

+0

感謝您的回答@Pointy。我已經在做AJAX請求了:dropzone通過Ajax將圖像發送到服務器,並且我想在dropzone的完整事件中使用此圖像。由於ruby是在頁面加載時評估的,我怎樣才能得到一個包含這個erb的文件,並在完成事件發生時進行評估? –

+0

您的服務器端代碼需要以某種方式將該URL作爲響應的一部分發回。 (該「完成」處理程序的'file'參數。)ajax操作返回什麼? – Pointy

回答

0

更一般地說,如何在我的javascript 頁面加載後使用erb而不解釋它?

你不能那樣做。 Javascript是客戶端,ruby是服務器端。如果你想同時處理兩者,你可以考慮ActionCable甚至Volt框架。但它不適合你的用例。

正如@Pointy在評論中指出的那樣,您想從服務器獲取url。其實你甚至不需要它,只是一勞永逸。例如:

$('div #mainPhotoDropzone').dropzone({ 
     url: "/photos?post_id=" + $("#post_form").data('post-id'), 
     complete: function(data){ 
      $('#mainPhotoDropzone').attr('style', "background-image: url('" + data.main_photo + "')"); 
     } 
})