您需要将其呈现为部分,并将资源作为本地传递:
<script>
<%= render :partial => 'resources/gallery_resource', :locals => { :resource => @resource } %>
</script>
此外,在gallery_resource.js.erb 文件中,您需要将@resource 更改为仅资源:
element.image = "<%= asset_path 'resources/galleries/'+resource.uid+'/'+index+'.jpg' %>"
如果这在任何其他操作中呈现,它们还需要在 :locals 散列中传递 :resource 值。
js.erb 文件的范围取决于以下几点:
- 如果控制器本身正在渲染文件,那么它可以访问实例变量(如“@resource”)。如果 view/viewtype/show.js.erb 存在并且浏览器请求了 js 响应类型,就会出现这种情况。就像使用 .html.erb 文件一样。
- 如果它被呈现为部分,那么唯一的范围就是你通过 :locals 散列传递的内容。这些不是实例变量,而是局部变量,因此它们被这样引用(如“资源”)。
- 另一方面,使用 javascript_include_tag 在 HTML 中创建一个直接引用 JS 文件的标记。如果您真的只需要包含一些不可变的 javascript,这没关系。这些要么必须在您的 app/assets/ 目录或您的 public/ 目录下的某个位置。
app/assets 或 public/ 中的文件无法访问单个请求中的变量——它们要么不被编译(public/),要么只预编译一次(app/assets)。
据推测,有问题的文件当前位于您的 app/assets 目录中。为了将其呈现为部分,请将其移动到 views/ 目录下的某个位置,在名称前面放置一个下划线 (_):
app/views/resources/_gallery_resource.js.erb