Rails 4公共/或app / assets /中的静态资产

时间:2013-11-22 02:24:17

标签: ruby-on-rails-4 asset-pipeline sprockets asset-sync

很抱歉,如果这是一个简单的问题的冗长积累,但我想清楚我的想法。

我现在已经在几个项目中使用了Rails 4并且我一直在使用image_tag('/assets/image.png')来解决资产路径助手在Rails 4中的工作方式。直到今天我决定了解更多信息关于更改并找到this first change note in sprockets-rails。我还注意到Rails助手中的/actionview/lib/action_view/helpers/asset_url_helper.rb#L170中的ASSET_PUBLIC_DIRECTORIES仅指向公用文件夹。对我来说很明显,如果你正在访问静态文件,Rails希望你使用公共文件夹。

所以现在我已经想到这一点,我只是不明白为什么 edge rails docs 明确说明了这一点:

  

在以前版本的Rails中,所有资产都位于公共子目录中,例如图像,javascripts和样式表。使用资产管道,这些资产的首选位置现在是app / assets目录。

image_path实际上会生成一个uri到public / images文件夹,这完全相反。

总而言之,我需要使用所有可用的帮助程序和摘要构建器,因为我最终使用asset_sync将资产部署到S3。

所以我的问题只是;有没有正确的位置来放置图像/非编译资产并使用asset_path助手?所有文档和所有其他堆栈溢出对话都是关于使用app / assets文件夹的人,但是sprockets-rails要求我们将public用于非摘要资产。网络上的文档和信息是否需要更新,或者是其他人只是通过使用/ assets /来预先填充所有资产路径?

更新:我认为我确实遇到了一个问题,即我没有重新启动我的开发服务器,并且app / assets / images中的图像没有显示,因此它会回退到公众面前。还要注意我在我的paperclip default_url中使用资产助手(在我发现的几个堆栈溢出答案中引用资源的方式被引用,但是在回形针中使用带有插值选项的资产路径助手也将回退到公众,因为未插入的资产名称显然不会作为现有文件找到。

1 个答案:

答案 0 :(得分:30)

当您使用rake assets:precompile时,Rails会将app/assets文件夹中的所有资源移至public/assets。这是因为普通浏览器无法访问您的app目录,但可以访问public

所以,回答你的问题,这是我的想法。如果您的图像是用于您的网站布局,例如徽标或背景,那么您应该将它们存储在app/assets/images目录中,但是,如果图像是用户生成的,例如个人资料图像,那么这些图像应该直接存储在为public/images。理想情况下,您可以将它们存储在S3或CDN中,但您已经这样做了。

作为奖励,Carrierwave是一个Rails图像上传宝石,它使用public/images类型路径作为其图像的默认存储,如您在其配置文件中所见:

    # Override the directory where uploaded files will be stored.
    # This is a sensible default for uploaders that are meant to be mounted:
     def store_dir
     "images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
     end

希望这有帮助!