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?

Author: matsko, 2012-08-25

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.

 21
Author: matsko,
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.

 6
Author: RandallB,
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:

  1. szablony powinny być przestrzenią nazw, więc szablony osób znajdują się w katalogu app/views/people/templates
  2. szablony są całkowicie statyczne, więc nie należy wywoływać wcześniej filtrów.
  3. 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.

 3
Author: superluminary,
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)

 1
Author: dzuc,
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.

 0
Author: kavkaz,
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>'
 0
Author: nicolas,
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