2012-04-18 5 views
11

Próba znalezienia sposobu zmiany hosta zasobu, gdy uzyska dostęp do niego określony kontroler.Przełącz host zasobu dla kontrolera

Sterownik musi być ściśle obsługiwany przez protokół https, więc potrzebuję przełączenia hosta zasobów na korzystanie z https. W tej chwili host zasobów jest ustawiony na poddomeny CNAME, która jest połączona z S3 i nie ma powiązania z certyfikatem SSL. Próbuję osiągnąć zastąpienie bieżącego hosta zasobu adresem URL Amazon S3 https. Martwię się tylko o CSS i JS.

Myślałem o użyciu helpera, aby usunąć hosta z stylesheet_link_tag i javascript_include_tag i zastąpić je adresem URL Amazon S3 https. Wydaje mi się jednak trochę hackish.

A może istnieje sposób na zmianę hostów zasobu, jeśli request.ssl? jest prawdziwy?

Używam Rails 3.2.x.

Odpowiedz

16

Wymyśl rozwiązanie dla mojej sprawy.

Zakończono za pomocą procesu na config.action_controller.action_host w moim pliku środowiska produkcyjnego do obsługi logiki na request.ssl? i odpowiednio zareaguj. Oto kod

config.action_controller.asset_host = Proc.new { |source, request = nil, *_| 
    request && request.ssl? ? 'https://s3.amazonaws.com/my_bucket' : 'http://s3.my-domain.com' 
} 

„żądanie” jest ustawiony na zero, aby dostosować się do przypadków, w których asset_host nazywa się w aktywach (plików CSS i JS, jeśli używasz tagów pomocniczych aktywów). Ponieważ żądanie nie istnieje i jeśli żądanie nie zostanie przypisane w args, błąd zostanie zgłoszony podczas kompilacji zasobów (jak pokazano poniżej).

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, or make it optional. 

Gwiazdka * _ występuje z powodu błędu z argumentów opcji w Proc http://bugs.ruby-lang.org/issues/5694

+0

To jest dobre, moja aplikacja jest multi-Tennant i swapy baz danych opartych na subdomeny, rozwiązanie to powinno działać tak samo dobrze zmienić subdomenę dla asset_host. Jedno pytanie brzmi: jak byście napisali test na to? –