如何在 app/views 中渲染 new.js.coffee.erb?

Posted

技术标签:

【中文标题】如何在 app/views 中渲染 new.js.coffee.erb?【英文标题】:How to render new.js.coffee.erb in app/views? 【发布时间】:2011-11-28 18:55:03 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

已确认;尽管缺少扩展名,但对部分进行了 ERB 评估,并且渲染能够很好地找到文件。 如果您同意这令人困惑,您可能想就这个问题发表意见:github.com/rails/coffee-rails/issues/36 一点更新。从 Rails 4 开始,您可以(并且必须)添加 .erb 扩展名,以便 erb 在 coffeescript 之前将其解析为模板。 @IAmNaN 直到 Rails 4.1.9,但名为 action.js.coffee.erb 的视图文件不会被识别为视图模板 实际上即使在 Rails 4.2/coffee-rails 4.1.0 中也无法识别此扩展...【参考方案2】:

如果您希望保留 .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 = %wextract_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

(这是投稿by cervinka on coffee-rails issue #36)

【讨论】:

以上是关于如何在 app/views 中渲染 new.js.coffee.erb?的主要内容,如果未能解决你的问题,请参考以下文章

在 rails create controller (Rails 6) 中渲染 new.js.erb

Yii2.0框架 视图 Views

我怎么能叫Play!没有渲染()的框架模板?

如何更改默认设计视图路径?

Rails 以不同的格式渲染动作

Express 错误 500:无法在视图目录“/app/views”中查找视图“index.html”