【问题标题】:Where's the best place to store user uploaded assetes in rails?在 Rails 中存储用户上传资产的最佳位置在哪里?
【发布时间】:2014-04-17 16:14:24
【问题描述】:

鉴于rake assets:clean 完全清空了public/assets 目录,我在弄清楚如何存储模型实例资产时遇到了一些问题。

例如,我有一个 Wine 模型,它使用 Carrierwave 在public/assets/wines/[version]_[wine_name].[ext] 中存储上传照片的多个版本。这工作得很好。该资产易于访问。

但由于它存储在public/assets/* 中,运行rake assets:clean 将删除它们!我该怎么办?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 assets sprockets


    【解决方案1】:

    我刚刚为我的投资组合网站做了这个。将通过某种管理面板上传的用户资产应存储在云端。类似于 Amazon S3 存储桶的东西。注册亚马逊网络服务。

    https://aws.amazon.com/

    它在一定程度上是免费的。如果您使用类似 heroku 的任何东西进行部署,您尤其应该这样做,否则您最终可能会在下一次提交时删除它们。我用回形针,设置很简单。 Carrierwave 可能类似。

    【讨论】:

    • 如果你愿意的话,我更喜欢使用“永远免费”的模式。我检查了我的带宽,它确实会持续几个月,这会产生 S3 的成本。我的主机提供了 cloudflare.net 的免费设置。我的资产托管在 assets.mydomain.com 上,它目前只是指向与我的应用程序相同的目录。如果我只是让 assets.mydomain.com 成为一个完全独立的目录来托管资产,这难道不能解决问题吗?
    • 我不确定。我从来没有尝试过这样的事情。不过我很想知道它是否有效。
    【解决方案2】:

    答案简单得令人麻木,我简直不敢相信我没想过早点尝试。

    载波示例:

    # It was this before
    def store_dir
        "assets/photos#{ '/testing' if Rails.env.test? }"
    end
    
    # Now it's this
    def store_dir
        "for/photos#{ '/testing' if Rails.env.test? }"
    end
    

    即文件夹布局是这样的:

    ..app/
        ../public
            ../assets # Contains only precompiled assets
            ../for # Contains only model instance assets
    

    常规预编译资产解析为http://mydomain.com/assets/*,实例资产解析为http://mydomain.com/for/*。具体来说,我有一个指向我的资产的子域称为http://assets.mydomain.com,因此例如它解析为http://assets.mydomain.com/for/wines/some-asset.jpg

    这解决了rake assets:clean 的问题,因为/for 目录从未被触及。无需在异地显式托管资产。

    现在关于我是否需要在生产中指定其他内容以便实际提供资产,我不知道 - 但至少在开发中这是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多