Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 在Rails 4中从javascript访问生产中的图像_Ruby On Rails 4_Asset Pipeline_Sprockets - Fatal编程技术网

Ruby on rails 4 在Rails 4中从javascript访问生产中的图像

Ruby on rails 4 在Rails 4中从javascript访问生产中的图像,ruby-on-rails-4,asset-pipeline,sprockets,Ruby On Rails 4,Asset Pipeline,Sprockets,现在,在Rails 4中,使用资产管道和sprocket Rails gem处理图像时,它们的文件名会附加一个md5指纹,比如css和javascript。这是有道理的,因为它使从javascript访问该图像变得越来越困难。在rails 3.2中,我可以使用/assets/image_name.jpg访问图像,它可以正常工作,但在rails 4中,该资产不存在,它只存在名称中的md5指纹 我知道rails提供了助手,可以通过erb访问图像,但这在javascript中并不理想,因为我在js中没

现在,在Rails 4中,使用资产管道和sprocket Rails gem处理图像时,它们的文件名会附加一个md5指纹,比如css和javascript。这是有道理的,因为它使从javascript访问该图像变得越来越困难。在rails 3.2中,我可以使用
/assets/image_name.jpg访问图像,它可以正常工作,但在rails 4中,该资产不存在,它只存在名称中的md5指纹

我知道rails提供了助手,可以通过erb
访问图像,但这在javascript中并不理想,因为我在js中没有使用erb。有很多方法可以通过在视图中提供数据属性或在视图中使用脚本标记并设置一些全局变量来解决这个问题,但我正在寻找一个很好的解决方案,如果这个问题存在的话


非常感谢您的帮助。

您为什么需要将资产管道用于图像?我得到了散列行为。但通常情况下,资产将被预处理。如果像以前一样将图像放在公共层次结构中,将获得正常的路径路由

这里有一段我认为可能有密切关系的引语。
“资产仍然可以放置在公共层次结构中。公共下的任何资产都将由应用程序或web服务器作为静态文件提供。对于在提供之前必须经过一些预处理的文件,您应该使用app/Assets。”

不幸的是,我认为您要么在JS中添加ERB扩展并使用资产助手,要么不使用资产管道

当你说“我没有在我的js中使用erb”时,你的意思是你不想,还是你根本不想?因为你可以

如果使用扩展名
.JS.erb
重命名相关JS文件,则可以在这些文件中使用
资产url
帮助程序,如下所示:

var src = "<%= asset_url('photo.jpg') %>";
var src=”“;

另一个要考虑的选项(虽然我不建议它)是在您的应用程序控制器中使用自定义路由来在控制器中为您获取资产路径,或者用MD5哈希返回URL到资产,或者可能只渲染资产的原始二进制数据。(尽管这会增加应用程序的处理开销)

例如,您向

然后在控制器中,您的操作方法如下所示:

def images
  ActionController::Base.helpers.asset_url(params[:file])
end
然后,这将返回到资产的url路径。此方法的缺点是,需要在JS端发出两个请求。第一个请求获取到资产的路径,第二个请求使用返回的路径实际加载该资产

要将此减少为一个请求,您可以让应用程序从文件系统读取图像并返回正确的标题,以便浏览器认为这是返回的图像,因此将呈现提供的url。但是,这将对应用程序和服务器上不需要的磁盘IO做更多的工作


客户端上的每个图像可能需要两个请求才能达到您想要的效果,但您必须牺牲一些地方…

如果我想利用图像资产的指纹来破坏更新时的缓存,该怎么办?我如何从javascript变量访问指纹图像?我正在寻找同样的东西,我发现了这一点。它实现了您想要的功能正在查找..这可能与“JS端的一个请求”一起工作,方法是使用
重定向到
将浏览器请求简单地重定向到正确的资源。从技术上讲,这仍然是两个请求,但您不需要再编写任何JS代码来处理它。您可以这样做:
重定向到ActionController::Base.helpers.asset\u url(params[:file])
…但是绕过资产管道会有问题(缓存等)因此,它绝对不推荐用于实际生产使用。一次性和简单让我看看,在prod中进行此类测试应该可以。是的@KarlWilbur是对的,重定向到似乎是一个更干净的解决方案。如果您处理大量图像并动态填充src(在JS中),这不是一个很好的选择--而不是像你那样硬编码。