如何在app/views中呈现new.js.coffee.erb?

ray*_*nly 31 jquery ruby-on-rails ujs asset-pipeline

使用Rails 3.1 jquery_ujs,我有一个链接有:遥控=> true,并控制新的行动,JS响应和渲染new.js.erb其中包含:

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

它呈现_form.html.erb部分.这有效.

现在我想使用Coffeescript,但将new.js.erb重命名为new.js.coffee.erb不起作用.资产管道是否仅适用于app/assets?我究竟做错了什么?谢谢.

cjb*_*aro 51

我使用Rails 3.1.0也有同样的问题.尝试将文件重命名为just new.js.coffee.尽管没有文件名的扩展名,它仍然应该呈现erb.

视图模板不遵循与资产管道相同的约定,这绝对令人困惑.

  • 确认; 尽管错过了扩展名,但是部分是ERB评估,并且渲染能够找到正常的文件. (2认同)

Oli*_*nce 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
Run Code Online (Sandbox Code Playgroud)

(这是cervinka对咖啡轨道问题#36的贡献)