0

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

<%= javascript_include_tag "resources/gallery_resource" %>

当资产路径是自包含的时,这可以正常工作,但是我需要使用资产路径内的控制器(@resource)中定义的变量:

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

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

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

4

2 回答 2

1

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

<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
于 2012-11-08T11:05:05.060 回答
1

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

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);
于 2012-11-08T12:18:18.783 回答