9

AngularJS と Rails を使用して Web サイトを構築しています。テンプレートに使用している HTML ファイルは /app/assets/templates に保存されており、ルートを更新するか、テンプレート内のネストされたパーシャル内の何かを変更するたびに、最上位のファイルに「触れる」必要があります変更する html ファイルの /app/assets/templates ディレクトリ。

したがって、部分的な「_form.html」をロードするページ「edit.html」がある場合、ルートを更新したり、_form.html で何かを変更したりするたびに、edit.html が変更されていることを確認する必要があります。

これは煩わしく、非常に厄介です。app/assets/templates ディレクトリのキャッシュを回避するためにアセット パイプライン/スプロケットに通知する方法はありますか?

4

6 に答える 6

21

私が見つけた最善の解決策は、HTML テンプレート ファイルにアセット パイプラインを使用しないことです。

代わりに、呼び出されるコントローラーTemplatesControllerを作成し、アクションを 1 つだけ作成します。次に、次のようなルートを使用して、すべてのテンプレート URL をそれにマップします。

get /templates/:path.html => 'templates#page', :constraints => { :path => /.+/  }

次に、すべてのテンプレート ファイルを次の場所に移動します。app/views/templates

次に、コントローラー内で、次のようにセットアップします。

caches_page :page

def page
  @path = params[:path]
  render :template => 'templates/' + @path, :layout => nil
end

このようにして、すべてのテンプレート ファイルがコントローラーから提供され、public/templates にキャッシュされます。キャッシュの問題を回避するために、テンプレート ルートへのタイムスタンプ パスを作成して、キャッシュされたファイルがバージョンと共に配信されるようにすることができます。

get '/templates/:timestamp/:path.html' => 'templates#page', :constraints => { :path => /.+/ }

このようにして、Web サイトをアップロードするたびに新しいタイムスタンプを取得し、テンプレート フォルダーを好きな場所に保存できます。テンプレート フォルダーを S3 に保存して、そのためのアセット URL を設定することもできます。次に、テンプレート ファイルがアドレス指定されている場所であればどこでも、カスタム アセット メソッドを使用できます。

templateUrl : <%= custom_asset_template_url('some/file.html') %>

どこ:

def custom_asset_template_url(path)
  "http://custom-asset-server.website.com/templates/#{$some_global_timestamp}/#{path}"
end

次に、アセットが見つからない場合はRailsサーバーにリダイレクトするだけで、アセットが生成されます。または、アップロード後にすべてのテンプレート ファイルを事前に生成することもできます。

于 2012-08-29T14:56:32.590 に答える
6

これに対処するためのはるかに(はるかに!)より良い方法があります。

<%= path_to_asset("template_name.html") %>

これにより、ERBなどを使用できるアセットパイプラインから完全に機能するファイルが返されます。これは文書化されていませんが、スプロケット/アセットパイプラインの一部です。

于 2013-02-24T01:28:39.573 に答える
3

私の考えでは、ここでいくつかのことが必要です。

  1. テンプレートは名前空間にする必要があるため、人物テンプレートは app/views/people/templates ディレクトリに配置されます
  2. テンプレートは完全に静的であるため、before フィルターを呼び出す必要はありません。
  3. テンプレートはキャッシュして、非常に高速にする必要があります。

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

先頭に追加されたフィルターでテンプレートを返していることに注意してください。これにより、他のフィルターにヒットすることなく静的コンテンツを返すことができます。

次に、次のようなルートを作成できます。

resources :people do
  collection do
    get 'templates/:template' => 'people#templates', as: :templates
  end
end

あなたのコントローラーは単純になります:

class PeopleController < ApplicationController
  include HasTemplates
end

/app/views/people/templates に配置されたファイルは、URL から高速で提供できるようになりました。

于 2014-10-20T16:08:47.157 に答える
1

RandallB の回答を少し拡張します。これは、アセット パイプラインのドキュメントで明示的に言及されています: http://guides.rubyonrails.org/asset_pipeline.html

これを機能させるには、拡張子 .erb を .coffee ファイルに追加する必要があることに注意してください。(例: application.js.coffee.erb)

于 2013-08-17T02:52:30.910 に答える