也许是一个非常愚蠢的问题,请不要因为这个而让我失望,但我终于让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)
答案 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" )
我相信会有一种更简单的方法可以做到这一点,但这样做可以快速而肮脏的解决方案。