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);