Это произойдет, когда (1) ваши активы используют пути, например:
background:url(image_path('awesome-background.gif'))
и (2) ваш asset_host
установлен в значение lambda / proc, для которого требуется второй аргумент (request
).
Вы можете либо удалить аргумент request
(если вы его фактически не используете), либо сделать его необязательным (и обработать случай, когда он равен nil
).Это легко сделать в Ruby 1.9 (и должно быть проще, см. Примечания):
config.action_controller.asset_host = ->(source, request = nil, *_){
# ... just be careful that request can be nil
}
Если вы хотите быть совместимым с Ruby 1.8, нет прямого способа создать Proc / lambda с параметрами по умолчанию, но вы можете использовать:
config.action_controller.asset_host = Proc.new do |*args|
source, request = args
# ...
end
Или сделать это, используя метод:
def MyApp.compute_asset_host(source, request = nil)
# ...
end
config.action_controller.asset_host = MyApp.method(:compute_asset_host)
Примечания:
- Ваш блокможет возвращать
nil
для обозначения «хоста по умолчанию», нет необходимости использовать "#{request.protocol}#{request.host_with_port}"
- Теоретически вам не нужно указывать протокол;URL, начинающийся с
//
, должен использовать протокол по умолчанию (http или https).Я говорю «должен», как выглядит IE <= 8 дважды загрузит ресурсы css </a>, и я столкнулся с проблемами с PDFkit.
Так что в вашем конкретном случаеВ этом случае ваш asset_host
может быть упрощен до:
config.action_controller.asset_host = Proc.new { |source, request = nil, *_|
"//assets#{(source.length % 4) + 1}.example.com" if request && !request.ssl?
}
Редактировать : используйте лямбду или *_
, чтобы избежать ошибки особенность Ruby .