2016-03-21 57 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 + "')"); 
     } 
})