31

使用 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 不起作用。资产管道是否仅适用于应用程序/资产?我究竟做错了什么?谢谢。

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 将文件识别为有效的视图模板:

# 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 在 coffee-rails issue #36 上的贡献)

于 2015-01-20T16:59:16.137 回答