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

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 并没有起作用。资产管道只在 app/assets 中起作用吗?我做错了什么?谢谢。

2个回答

51

我在使用Rails 3.1.0时遇到了同样的问题。试试将文件重命名为new.js.coffee。尽管文件名没有扩展名,但它仍应呈现erb。

很明显视图模板与资产管道不遵循相同的约定,这确实令人困惑。


2
已确认;尽管缺少扩展名,部分内容仍然经过 ERB 评估,并且渲染可以很好地找到该文件。 - Teflon Ted
1
如果您认为这很令人困惑,您可能希望在以下问题中发表意见:https://github.com/rails/coffee-rails/issues/36 - Silas Davis
1
一个小更新。从Rails 4开始,你可以(也必须)添加.erb扩展名,以便在coffeescript之前由erb解析为模板。 - IAmNaN
实际上,即使在Rails 4.2 / coffee-rails 4.1.0中,这个扩展也无法被识别... - Olivier Lance
@OlivierLance:这很令人困惑。我的项目有两个.js.coffee.erb文件,两个都能正常工作。Rails版本为4.2.0,coffee-rails gem也是4.1.0。没有相关的初始化程序。 - IAmNaN
显示剩余2条评论

4
如果您想保留 ".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问题#36上做出的贡献{{link1:链接}})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接