7

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 %>代わりに書くと、問題なく動作します。

render()問題は、アセット パイプラインがデフォルトの ActionView から独立していることであり、それが不明な理由だと思います。とにかく、そのパーシャルのコンテンツをレンダリングする方法はありますか?

4

6 に答える 6

8

悪いニュース、レンダリングは利用できません 見てください: GitHub の同じ質問

于 2011-10-06T13:50:22.760 に答える
5

アセットは、コンテンツを動的に変更しない CSS、JS、画像などの静的データを対象としているため、より適切にキャッシュしたり、CDN にエクスポートしたりできます。

ruby コードで ERB を実行することが許可されているため、常に同じ値を返す必要があります (アセットのコンパイル時にのみ実行されるため)。

そのため、 renderはアセット内では使用できないと思います(ただし、静的データのレンダリングには適切に使用できます)。

ここでの簡単な解決策: JS ファイルをビューに移動すると、任意のビュー ヘルパーを使用できるようになります。

于 2011-12-02T22:20:36.967 に答える
1

レール4.2で

<% require_asset 'path/to/file' %> の使用を提案するこの投稿https://github.com/sstephenson/sprockets/issues/90を見つけました

これは私にとってはうまくいきました。

于 2016-01-14T18:44:24.063 に答える
1

これは私にとってはうまくいきました。(HAMLの場合)

= 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
于 2014-07-11T03:19:07.490 に答える
1

同様の問題があったため、アセット内で使用してERB部分テンプレートrenderをレンダリングできる次のメソッドを作成しました。

# 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 アプリでテストしました

于 2016-09-14T12:35:42.667 に答える
-2

実際、それは私のために働きます。あなたがする必要があります:

= render 'way/to/partial'

ここで、「way / to / partial」は、既存のアセットフォルダーの下の相対パスです。有線のことは、パスで、アセットの下の第1レベルのフォルダーを省略する必要があるということです。

于 2012-11-25T19:32:35.050 に答える