20

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

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

所以现在我已经弄清楚了,我就是不明白为什么边缘导轨文档清楚地说明了这一点:

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

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

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

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

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

4

1 回答 1

31

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

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

作为奖励,Carrierwave 是一个 Rails 图像上传 gem,它使用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

希望这可以帮助!

于 2014-02-05T18:45:46.877 回答