31

Rails 3.1 jquery_ujs を使用して、:remote => true とのリンクがあり、コントローラーの new アクションは js で応答し、以下を含む new.js.erb をレンダリングします。

$('#post-form').html('<%= escape_javascript(render(:partial => "form")) %>');

_form.html.erb パーシャルをレンダリングします。これは機能します。

今は Coffeescript を使いたいのですが、new.js.erb を new.js.coffee.erb に名前を変更してもうまくいきません。アセット パイプラインはアプリ/アセットでのみ機能しますか? 私は何を間違っていますか?ありがとう。

4

2 に答える 2

51

Rails 3.1.0 を使用して同じ問題が発生しました。ファイルの名前をnew.js.coffee. ファイル名に拡張子がなくても、erb をレンダリングする必要があります。

ビュー テンプレートがアセット パイプラインと同じ規則に従っていないことは、間違いなく混乱を招きます。

于 2011-10-15T22:40:15.230 に答える
5

拡張子を保持したい場合は.js.coffee.erb、Rails 4 が有効なビュー テンプレートとしてファイルを認識できるようにするための Rails 4 のコードを次に示します。

# config/initializers/coffee_erb_handler.rb
ActionView::Template.register_template_handler 'coffee.erb', Coffee::Rails::TemplateHandler # without this there will be template not found error

class ActionView::PathResolver < ActionView::Resolver
  EXTRACT_METHODS = %w{extract_handler_and_format_and_variant extract_handler_and_format} # name for rails 4.1 resp. 4.0

  method_name = EXTRACT_METHODS.detect{|m| method_defined?(m) || private_method_defined?(m)}
  raise 'unknown extract method name' if method_name.nil?

  old_method_name = "old_#{method_name}"

  alias_method old_method_name, method_name
  define_method(method_name) do |path, default_formats|
    self.send(old_method_name, path.gsub(/\.js\.coffee\.erb$/, '.js.coffee'), default_formats)
  end
end

(これは、Coffee-Rails issue #36 での cervinka による寄稿です)

于 2015-01-20T16:59:16.137 に答える