很抱歉,如果这是一个简单的问题的冗长积累,但我想清楚我的想法。
我现在已经在几个项目中使用了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中使用资产助手(在我发现的几个堆栈溢出答案中引用资源的方式被引用,但是在回形针中使用带有插值选项的资产路径助手也将回退到公众,因为未插入的资产名称显然不会作为现有文件找到。
答案 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
希望这有帮助!