我的资产是否来自AWS S3

时间:2013-03-19 20:59:10

标签: ruby heroku amazon-s3 sinatra assets

也许是一个非常愚蠢的问题,请不要因为这个而让我失望,但我终于让Heroku在我的S3存储桶中使用asset_sync编译其静态资产。

现在,我怎么知道这些资产实际上是从那里获得的,我认为没有什么神奇的东西可以从s3中获取它们?我必须为每个前缀为

的资产设置路径
https://s3-eu-west-1.amazonaws.com/pathto/asset

有没有办法明确地在sinatra中设置它,我不必手动更改每个资产吗?那会很傻。

asset_sync文档说要在rails

中使用它
config.action_controller.asset_host = "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"

但我不确定如何在sinatra中设置它

修改

require 'bundler/setup'
Bundler.require(:default)
require 'active_support/core_ext'
require './config/env' if File.exists?('config/env.rb')
require './config/config'
require "rubygems"
require 'sinatra'


configure :development do
AssetSync.config.action_controller.asset_host = "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"
end


get '/' do
 erb :index
end

get '/about' do
 erb :about
end

这会在控制台中出现以下错误

 undefined method `action_controller' for #<AssetSync::Config:0x24d1238> (NoMethodError)

1 个答案:

答案 0 :(得分:2)

尝试通过Sinatra's configure block将其放入Async Built-in initializer,例如:

configure :production do
  AssetSync.config.action_controller.asset_host = "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"
end

您可能还需要在某个时候致电AssetSync.sync,我不确定。


编辑:使用配置块。

如果您使用的是模块化应用程序(如果没有,则没有任何不同,只需删除class位)

class App < Sinatra::Base
  configure :development do
    set :this, "and that"
    enable :something
    set :this_only, "gets run in development mode"
  end

  configure :production do
    set :this, "to something else"
    disable :something
    set :this_only, "gets run in production"
    # put your AssetSync stuff in here
  end

  get "/" do
    # …
  end

  get "/assets" do
    # …
  end

  post "/more-routes" do
    # …
  end

  # etc
end

请参阅我上面添加的链接以获取更多信息。


action_controller是Rails的一部分。要为路径添加前缀,您可以做的最好的事情是使用帮助程序:

helpers do
  def aws_asset( path )
    File.join settings.asset_host, path
  end
end

configure :production do
  set :asset_host, "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"
end

configure :development do
  set :asset_host, "/" # this should serve it from the `public_folder`, add subdirs if you need to.
end

然后在路线或视图中,您可以执行以下操作:

aws_asset "sprite_number_1.jpg"

与ERB和sinatra-static-assets's image_tag一起使用:

image_tag( aws_asset "sprite_number_1.jpg" )

或将它们组合在一起(这可能不起作用,因为在帮助程序范围内可能看不到image_tag帮助程序,尝试它比思考它更容易):

helpers do
  def aws_image( path )
    image_tag( File.join settings.asset_host, path )
  end
end

# in your view
aws_image( "sprite_number_1.jpg" )

我相信会有一种更简单的方法可以做到这一点,但这样做可以快速而肮脏的解决方案。