2011-09-06 4 views
13

:3.1 nedeniyle varlık konak config eşya üzerinde varlıklarını derlemek edemez raylar yapılandırma asset_host My üretim şöyle

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 
    } 

... az ya da çok düz dokümanlardan olan:

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

Ben varlıklara gidin: ön derleme, bu alın:

$ 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. 

.... iy pt 2 argümanını gerçekten kaldıramam çünkü isteğim ssl olup olmadığını bilmem gerekiyor. Bu, isteğinin, varlıkları oluşturmak için komisyon görevi sırasında mevcut olmadığını anladım.

Peki bu yakalayıcıdan nasıl çıkarım 22?

cevap

18

Bu olur:

background:url(image_path('awesome-background.gif')) 

ve (2) senin asset_host ikinci argüman (gerektiren bir lambda/proc olarak ayarlanır request).

Seçenekleriniz ya request bağımsız değişkenini kaldırmalı (aslında kullanmıyorsanız) ya da isteğe bağlı yapmalısınız (ve nil'un bulunduğu durumun üstesinden gelin). Bu (, notlara bakın ve daha kolay olmalı) Ruby 1.9 de kolaydır:

config.action_controller.asset_host = ->(source, request = nil, *_){ 
    # ... just be careful that request can be nil 
} 

Eğer Ruby 1.8 ile uyumlu olmasını istiyorsanız, varsayılanlarla parametrelerle bir Proc/lambda oluşturmak için doğrudan bir yol yoktur, fakat

config.action_controller.asset_host = Proc.new do |*args| 
    source, request = args 
    # ... 
end 

Yoksa bir yöntemi kullanarak yapmak: kullanabileceğiniz

def MyApp.compute_asset_host(source, request = nil) 
    # ... 
end 

config.action_controller.asset_host = MyApp.method(:compute_asset_host) 

Notlar:

  1. "varsayılan ana" belirtmek için nil döndürebilir Engellenme, gerek protokolü belirtmek gerekmez Teoride "#{request.protocol}#{request.host_with_port}"
  2. kullanmak; // ile başlayan bir URL varsayılan protokolü (http veya https) kullanmalıdır. IE <= 8 will download the css assets twice gibi göründüğü gibi "yapmalıyım" diyorum ve PDFkit ile ilgili sorunlarla karşılaştım.

    config.action_controller.asset_host = Proc.new { |source, request = nil, *_| 
        "//assets#{(source.length % 4) + 1}.example.com" if request && !request.ssl? 
    } 
    

    Düzenleme:

yüzden özel durumda, senin asset_host basitleştirilmiş edilebilir bir bug feature of Ruby önlemek için başka bir lambda veya *_ kullanın.

+0

İstenmezse istekte && request.ssl? '' Istekte bulunmadı && request.ssl? ' –

+0

@EricKoslow: Oh, doğru, koşulun bir kısmını tersine çevirdim. Sabit, düşünüyorum :-) –

+1

Bu harika bir cevap, lütfen doğru olarak işaretleyin! –

3

Ruby 1.8.x için, @ Marc-Andre'nin method(:compute_asset_host) tekniği benim için çalışmadı.Yöntem doğrudan yukarıda tanımlanmış olmasına rağmen, NameError: undefined method `compute_asset_host' for class `Object' yükseltildi.

İşte benim için çalıştı budur:

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

Örneğimi, daha açık bir hale getirmek için açık bir kapsam ile düzenledim. Önerilen Proc'unuz iyi, bu yüzden onu da ekledim. Teşekkürler. –