Statyczne pliki szablonów html rails w potoku zasobów i buforowanie w trybie deweloperskim
Buduję stronę internetową za pomocą AngularJS i Rails. Pliki HTML, których używam do tworzenia szablonów, są przechowywane w katalogu /app/assets /templates i za każdym razem, gdy aktualizuję trasę lub zmieniam coś wewnątrz zagnieżdżonej części w szablonie, muszę "dotknąć" najwyższego poziomu pliku w katalogu/app/assets / templates dla pliku html, który zmieniam.
Więc jeśli mam stronę " edit.html "który ładuje częściowy" _form.html " wtedy za każdym razem, gdy aktualizuję trasę lub zmieniam coś w _form.html I musisz się upewnić, że edycja.html jest dotknięty.
To denerwujące i bardzo wybredne. Czy jest jakiś sposób, aby poinformować asset pipeline / sprockets, aby uniknąć buforowania dla katalogu app/assets / templates?
6 answers
Najlepszym rozwiązaniem, jakie znalazłem, jest nie używanie potoku zasobów do plików szablonów HTML.
Zamiast tego stwórz kontroler o nazwie TemplatesController
i utwórz tylko jedną akcję.
Następnie zmapuj wszystkie adresy URL szablonu do tego za pomocą trasy, takiej jak:
get /templates/:path.html => 'templates#page', :constraints => { :path => /.+/ }
Następnie przenieś wszystkie pliki szablonów do app/views/templates
Następnie wewnątrz kontrolera ustaw następujące ustawienia:
caches_page :page
def page
@path = params[:path]
render :template => 'templates/' + @path, :layout => nil
end
W ten sposób wszystkie pliki szablonów będą serwowane z kontrolera, a następnie będą buforowane do public / templates. Aby uniknąć problemów z pamięcią podręczną, możesz utworzyć ścieżkę znacznika czasu do trasy szablonu, aby pliki w pamięci podręcznej były dostarczane w wersji:
get '/templates/:timestamp/:path.html' => 'templates#page', :constraints => { :path => /.+/ }
W ten sposób możesz mieć nowy znacznik czasu za każdym razem, gdy przesyłasz witrynę i możesz przechowywać folder szablonów w dowolnym miejscu. Możesz nawet przechowywać folder szablony na S3 i mieć do tego adres URL zasobów. Następnie, gdziekolwiek są adresowane pliki szablonów, możesz użyć niestandardowej metody zasobów:
templateUrl : <%= custom_asset_template_url('some/file.html') %>
Gdzie:
def custom_asset_template_url(path)
"http://custom-asset-server.website.com/templates/#{$some_global_timestamp}/#{path}"
end
Wtedy wystarczy przekierować zasób na serwer Rails, jeśli nie zostanie znaleziony i zostanie wygenerowany. Lub wszystkie pliki szablonów mogą być wstępnie wygenerowane po przesłaniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 20:45:10
Jest wiele (much!) lepszy sposób radzenia sobie z tym.
<%= path_to_asset("template_name.html") %>
Zwróci w pełni działający plik z potoku zasobów, który może używać ERB, itd. Jest nieudokumentowana, ale jest częścią łańcuchów zębatych / rurociągu aktywów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-24 01:28:39
Moim zdaniem kilka rzeczy jest tu potrzebnych:
- szablony powinny być przestrzenią nazw, więc szablony osób znajdują się w katalogu app/views/people/templates
- szablony są całkowicie statyczne, więc nie należy wywoływać wcześniej filtrów.
- szablony powinny być buforowane, dzięki czemu są bardzo szybkie.
Oto możliwe rozwiązanie za pomocą problemu Rails:
# Allows static content to be served from the templates
# directory of a controller
module HasTemplates
extend ActiveSupport::Concern
included do
# Prepend the filter
prepend_before_filter :template_filter, only: [:templates]
# Let's cache the action
caches_action :templates, :cache_path => Proc.new {|c| c.request.url }
end
# required to prevent route from baulking
def templates;end
# Catch all template requests and handle before any filters
def template_filter
render "/#{params[:controller]}/templates/#{params[:template]}", layout: 'blank'
rescue ActionView::MissingTemplate
not_found layout: 'blank'
false
end
end
Uwaga zwracamy szablon w dołączonym filtrze. To pozwala nam zwrócić zawartość statyczna bez uderzania w inne filtry.
Możesz następnie utworzyć trasę, coś w tym stylu:
resources :people do
collection do
get 'templates/:template' => 'people#templates', as: :templates
end
end
Twój kontroler staje się po prostu:
class PeopleController < ApplicationController
include HasTemplates
end
Teraz każdy plik umieszczony w /app/views/people / templates może być obsługiwany z prędkością z adresu url.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 16:08:47
Rozszerzanie odpowiedzi RandallB nieco; jest to wyraźnie wspomniane w dokumentacji potoku zasobów: http://guides.rubyonrails.org/asset_pipeline.html
Zauważ, że musisz dołączyć rozszerzenie .erb do ciebie .teczka z kawą do tej pracy. (np. aplikacja.js.kawa.erb)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-17 02:52:30
Możesz spróbować gem js_assets
(https://github.com/kavkaz/js_assets).
Pozwala to na działanie asset_path
w kodzie javascript, który emuluje podobną metodę kół zębatych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 14:51:46
Najczystszym rozwiązaniem jest prekompilacja zasobów html za pomocą ejs i serwowanie ich jako innych plików javascript.
- Brak zapytania http
- minifikacja
- możliwość przekazywania danych js do szablonów w celu uczynienia ich dynamicznymi (ejs to port z szablonu podkreślenia i w zasadzie zachowuj się jak erb dla javascript)
To w zasadzie działa tak:
#in you gemfile
gem 'ejs'
#in app/assets/javascripts/templates/my_template.jst.ejs
<p>my name is <%= name %> !<p>
#in your application.coffee
#= require_tree ./templates
JST['templates/my_template'](name: 'itkin')
=> '<p>my name is itkin !<p>'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-28 03:53:32