gpt4 book ai didi

javascript - js.erb 文件中 Ruby 代码的范围是什么以及它如何访问 Controller 变量

转载 作者:行者123 更新时间:2023-12-02 19:14:22 25 4
gpt4 key购买 nike

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

<%= javascript_include_tag "resources/gallery_resource" %>

当 Assets 路径是独立的时,这可以正常工作,但是我需要使用 Assets 路径内 Controller (@resource)中定义的变量:

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

问题是@resource 未定义。那么,如果这段 Ruby 代码无权访问 Controller ,它的作用范围是什么?我应该如何使该变量在这里可用?

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

最佳答案

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

<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 文件的范围取决于以下几个因素:

  • 如果 Controller 本身正在渲染文件,则它可以访问实例变量(例如“@resource”)。这就是views/viewtype/show.js.erb 的情况,如果它存在并且浏览器请求js 响应类型。就像 .html.erb 文件一样。
  • 如果它被渲染为部分,那么唯一的范围是您通过 :locals 哈希传入的范围。这些不是实例变量,而是局部变量,因此它们被这样引用(如“资源”)。
  • 另一方面,使用 javascript_include_tag 可以在 HTML 中创建一个直接引用 JS 文件的标签。如果您确实只需要包含一些不可变的 javascript,那么这是可以的。这些必须位于您的 app/assets/目录或 public/目录下的某个位置。

app/assets 或 public/中的文件无法访问各个请求中的变量 - 它们要么不被编译(public/),要么只预编译一次(应用程序/ Assets )。

据推测,相关文件当前位于您的 app/assets 目录中。为了将其渲染为部分,请将其移动到views/目录下的某个位置,并在名称前面添加下划线(_):

app/views/resources/_gallery_resource.js.erb

关于javascript - js.erb 文件中 Ruby 代码的范围是什么以及它如何访问 Controller 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com