Ответ 1
Это произойдет, когда (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 дважды, и я столкнулся с проблемами с PDFkit.
Итак, в вашем конкретном случае ваш asset_host
можно упростить до:
config.action_controller.asset_host = Proc.new { |source, request = nil, *_|
"//assets#{(source.length % 4) + 1}.example.com" if request && !request.ssl?
}
Изменить: используйте lambda или *_
, чтобы избежать ошибка в Ruby.