js.erb文件中Ruby代码的范围是什么,它如何访问控制器变量

我有一个js.erb文件,我想在其中使用asset_path。 它包含在这样的视图中:

 

这在资产路径是自包含的情况下工作正常,但是我需要在资产路径中使用控制器(@resource)中定义的变量:

 element.image = "" 

问题是@resource没有定义。 那么如果Ruby代码无法访问控制器,那么它的范围是什么? 我该如何在这里提供变量?

我理解如何使Javascript可以访问变量,但我想让它可用于嵌入式Ruby。

您需要将其呈现为部分,并将资源作为本地传递:

  

此外,在gallery_resource.js.erb文件中,您需要将@resource更改为仅资源:

 element.image = "<%= asset_path 'resources/galleries/'+resource.uid+'/'+index+'.jpg' %>" 

如果在任何其他操作中呈现它,则它们还需要在:locals哈希中传递:resource值。

js.erb文件的范围取决于以下几点:

  • 如果控制器本身正在渲染文件,那么它可以访问实例变量(例如’@resource’)。 如果视图/ viewtype / show.js.erb存在且浏览器请求了js响应类型,则会出现这种情况。 就像.html.erb文件一样。
  • 如果它被呈现为部分,那么唯一的范围是您传入的:locals哈希。 这些不是实例变量,而是局部变量,因此它们被引用(如’resource’)。
  • 另一方面,使用javascript_include_tag在HTML中生成一个直接引用JS文件的标记。 如果你真的只需要包含一些不可变的javascript,这没关系。 这些要么必须位于app / assets /目录下的某个位置,要么位于您的公共/目录下。

app / assets或public /中的文件无法访问各个请求中的变量 – 它们要么不被编译(公共/),要么只预编译一次(app / assets)。

据推测,该文件目前位于您的app / assets目录中。 为了将其呈现为局部,将其移动到views /目录下的某处,在名称前放置下划线(_):

 app/views/resources/_gallery_resource.js.erb 

为了记录,我对此问题的解决方案是使用令牌获取基本路径:

 var base_path = "<%= asset_path 'resources/galleries/{{X}}.jpg' %>"; 

然后使用优秀的gon gem使用可用的控制器变量替换令牌

 var imagePathFragment = gon.resource.uid+'/'+(index+1); element.image = base_path.replace('{{X}}', imagePathFragment);