问题 flash文件应该存放在哪里?


在Rails 3.0.X中,我将我的flash文件存储在public / flash中。 Flash文件,例如:jwplayer,uploadify等。

随着3.1中新目录结构的引入(即app / assets /),flash文件是否仍然存储在public / flash中,还是应该在app / assets /中创建一个名为'flash'的新目录?


7680
2018-05-25 17:27


起源

我还没有开始玩3.1,但如果app / assets中的任何东西都可以公开提供,我会感到震惊 - 从安全角度或尊重公共目录的约定来说这是没有意义的。由于您需要这些Flash文件可公开访问,因此您应该将它们公开存储。 - Jeremy Weathers
基于这种理解。应用图片怎么样?如果徽标,横幅,主背景,图标等图像被视为公共图像,为什么app / assets中会出现图像目录?或者我们是否仍应将这些类型的图像放在公共/图像中。如果是这样,app / assets中的图像目录用于什么? - Christian Fazzini
@JeremyWeathers:资产管道用于隐藏私人内容。它用于预编译资产和缓存清除。 - iGEL
我想写一下:资产管道不是用于隐藏私人内容。 - iGEL


答案:


如果是这样的话 .swf 文件,我不认为他们属于 app/assets。资产文件夹允许为CoffeeScript和SCSS(或类似的js和css“编译器”)预先“编译”的应用程序资产文件。如果你正在编译 .as 文件到 .swf 作为部署或启动过程的一部分,我可以看到将它们放在资产文件夹中是有意义的。然而,这似乎是一个可怕的想法。

================= UPDATE =====================

我错了。资产文件夹用于提供Sprockets资产。只要您可以处理消化的资产路径,就应该使用Sprockets。


2
2018-05-25 17:47



如果它们是用于预编译的“app”资产文件,为什么app / assets中有图像目录? - Christian Fazzini
Christian,我们的应用程序中的图像仅包含在应用程序生成的PDF中。将它们存储在app / assets而不是public中是有意义的。 - Jeremy Weathers
我不同意。它不仅适用于预编译资产。如果您使用Rails资产管道,您将受益于它的缓存清除功能,并告诉浏览器永远缓存它们。这就是为什么图像在资产中也占有一席之地。但是你不能使用硬编码路径。如果你照顾好了(例如通过rails生成flash vars或xmls告诉flash所有路径),你可以从中受益匪浅。 - iGEL
我其实不得不同意iGEL。现在我已经使用了Sprockets更长的时间,我会说如果你可以处理“消化”路径,你应该将你的swf文件放在assets目录中。 - jesse reiss


你可以使用 链轮 provide 指示

例如,这就是我使用Plupload的方式:

# app/assets/javascripts/plupload.js
//= require plupload/plupload
//= require plupload/plupload.flash
//= require plupload/plupload.silverlight
//= provide plupload/dependencies

相应的供应商目录的组织方式如下:

vendor
├── assets
│   ├── javascripts
│   │   └── plupload
│   │       ├── dependencies
│   │       │   ├── plupload.flash.swf
│   │       │   └── plupload.silverlight.xap
│   │       ├── plupload.flash.js
│   │       ├── plupload.js
│   │       └── plupload.silverlight.js
│   └── stylesheets
└── plugins

然后我用 <%= javascript_include_tag 'plupload' %> 当我想使用Plupload,并使用 asset_path 帮助器填充Plupload配置:

<%= javascript_include_tag 'plupload' %>

<script type="text/javascript">
$(function() {
    var uploader = new plupload.Uploader({
        runtimes : 'flash,silverlight',
        multipart : true,
        multipart_params : {
            'authenticity_token' : '<%= form_authenticity_token %>'
        },
        flash_swf_url : 
            '<%= asset_path "plupload/dependencies/plupload.flash.swf" %>',
        silverlight_xap_url :
            '<%= asset_path "plupload/dependencies/plupload.silverlight.xap" %>',
        url : '<%= url_for [@item, :photos] %>',
        // ...
    });

希望有所帮助。


12
2017-07-28 11:55



不适用于Rails 4 - Eric Luo


我想,这两个地方都有很好的论据。使用资产管道(将它们存储在/ app / assets下)有一个缺点,即不能从闪存中硬链接任何静态文件,因为你无法告诉生产中的文件名(Rails会将内容的哈希值添加到文件名中) )。您必须使用包含资源文件名的Rails生成flashvars或xml文件。

但是,如果使用资产管道,如果文件更改,每个文件将在其文件名中获得新的哈希值。您可以告诉浏览器永久缓存文件,因为一旦您引用已更改的文件,它将是浏览器的新内容(< - 文件名),它将从服务器加载更改的文件。缓存可以让您的网站更快地回访访问者。


1
2017-10-27 12:33