資産の部分的なレンダリング
-
27-10-2019 - |
質問
Ruby on Rails 3.1を使用していますが、JavaScriptアセットでどのように部分的にレンダリングできるのか疑問に思っています。
私が目指していること:
# in /app/assets/javascript/cart.js.coffee.erb
$('a.add_sth').click -> $('.random_container').append('<%= render partial: 'way/to/partial' %>')
これにより、nomethoderrorが発生します。
undefined method `render' for #<#<Class:0x007fc54584c6e8>:0x007fc5474cd470>
私が書いたら <%= 2+3 %>
代わりに、それは正常に動作します、ところで。
問題は、アセットパイプラインがデフォルトのActionViewから独立していることであり、それが理由です render()
そこに不明です。とにかく、その部分のコンテンツをレンダリングする方法はありますか?
解決
悪いニュース、レンダリングは利用できません外観: Githubで同じ質問
他のヒント
資産は、コンテンツを動的に変更しないCSS、JS、または画像などの静的データを対象としているため、CDNにキャッシュされたりエクスポートしたりすることができます。
RubyコードでERBを実行することは許可されているため、常に同じ値を返す必要があります(資産をコンパイルするときにのみ実行されるため)。
だから私は推測します 与える 資産内では利用できません(ただし、静的データをレンダリングするために適切に使用できます)。
ここで簡単な解決策: JSファイルをビューに移動します, 、そこでは、任意のビューヘルパーを使用できます。
これは私のために働いた。 (ハムルの場合)
= Haml::Engine.new(File.read(File.join(Rails.root, 'app/views/xxxxx','_form.html.haml'))).render(Object.new, :hello => "Hello World")
また、ファイルの先頭に依存関係を追加する必要があります。この場合、資産に依存するファイルが必要です。
//= depend_on xxxxx/_form.html.haml
レール4.2
この投稿を見つけました https://github.com/sstephenson/sprockets/issues/90これは、<%require_asset 'path/to/file'%>を使用することを示唆しています
これは私のために働いた。
同様の問題があったので、これを書きました render
メソッド、それは資産内で使用してレンダリングできる erb 部分テンプレート:
# in lib/my_app/erb_helpers.rb
module MyApp
module ERBHelpers
class << self
def render(partial_path, binding)
dir_name, _, partial_name = partial_path.rpartition(File::SEPARATOR)
file_name = "_#{partial_name}.html.erb"
Erubis::Eruby.new(File.read(File.join(Rails.root, 'app', 'views', dir_name, file_name)).gsub("'", %q(\\\'))).result(binding)
end
end
end
end
次に、このようなcoffeescriptファイル内でそれを使用しました:
# in app/assets/javascripts/notifications.coffee
MyApp.notifications.templates =
notice: '<%= ::MyApp::ERBHelpers.render 'application/notifications/notice', content: "%content%" %>'
alert: '<%= ::MyApp::ERBHelpers.render 'application/notifications/alert', content: "%content%" %>'
MyApp.notifications.create_elem = (type, content) -> MyApp.notifications.templates[type].replace('%content%', content)
PS: Rails 5.0アプリでテストしました
実際、それは私のために働いています。あなたがする必要があります:
= render 'way/to/partial'
ここで、「方法/to/partial」は、既存のアセットフォルダーの下の相対パスです。有線なことは、パスでは、アセットの下で最初のレベルフォルダーを省略する必要があるということです。