web-dev-qa-db-ja.com

app / viewsでnew.js.coffee.erbをレンダリングする方法は?

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

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

_form.html.erbを部分的にレンダリングします。これは機能します。

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

31
rayvinly

Rails 3.1.0。ファイルの名前をnew.js.coffeeだけに変更してみてください。ファイル名に拡張子がないにもかかわらず、erbがレンダリングされるはずです。

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

51
cjbottaro

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

# 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

(これは貢献です コーヒーのcervinkaによる-Rails Issue#36

5
Olivier Lance