哪里是将用户上传的资产存储在rails中的最佳位置?

时间:2014-04-17 16:14:24

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

https://aws.amazon.com/

它可以释放到某一点。如果你使用像heroku这样的东西进行部署,你应该特别这样做,否则你可能会在下次提交时删除它们。我用过回形针,设置很简单。 Carrierwave可能类似。

答案 1 :(得分:0)

答案如此令人难以置信的简单,我无法相信我没想过要早点尝试。

Carrierwave示例:

# 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目录。无需在场外明确托管资产。

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