rails 3.1 не может скомпилировать ресурсы на prod из-за конфигурации хоста ресурсов - PullRequest
13 голосов
/ 06 сентября 2011

Моя производственная конфигурация asset_host выглядит следующим образом:

  config.action_controller.asset_host = Proc.new { |source, request| 
    if request.ssl? 
      "#{request.protocol}#{request.host_with_port}" 
    else 
      "#{request.protocol}assets#{(source.length % 4) + 1}.example.com" 
    end 
  } 

... что более или менее прямо из документов:

http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html

Когда яперейти к assets: precompile, я получаю это:

$ RAILS_ENV=production bundle exec rake assets:precompile 
rake aborted! 
This asset host cannot be computed without a request in scope. Remove 
the second argument to your asset_host Proc if you do not need the 
request. 

.... за исключением того, что я не могу действительно удалить 2-й аргумент, потому что мне нужно знать, является ли запрос ssl или нет.Тем не менее, я понимаю, что во время задачи rake отсутствует запрос на генерацию активов ....

Итак, как мне получить этот улов 22?

Ответы [ 3 ]

18 голосов
/ 29 ноября 2011

Это произойдет, когда (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)

Примечания:

  1. Ваш блокможет возвращать nil для обозначения «хоста по умолчанию», нет необходимости использовать "#{request.protocol}#{request.host_with_port}"
  2. Теоретически вам не нужно указывать протокол;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 .

3 голосов
/ 19 января 2012

Для ruby ​​1.8.x метод @ 1001 * @ Marc-Andre не работал для меня. Несмотря на то, что метод был определен непосредственно выше, NameError: undefined method `compute_asset_host' for class `Object' был повышен.

Вот что сработало для меня:

config.action_controller.asset_host = Proc.new do |*args|
  source, request = args
  if request.try(:ssl?)
    'ssl.cdn.mysite.com'
  else
    'cdn%d.mysite.com' % (source.hash % 4)
  end
end
0 голосов
/ 14 сентября 2011

Ошибка в Rails. Исправлено.

https://github.com/rails/rails/issues/2947

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...