Как визуализировать 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 не работает. Работает ли конвейер активов только в приложении/активах? Что я делаю не так? Спасибо.

Ответ 1

У меня была такая же проблема с Rails 3.1.0. Попробуйте переименовать файл только new.js.coffee. Он должен все равно отображать erb, несмотря на то, что не имеет расширения на имя файла.

Это определенно запутывает, что шаблоны представлений не соответствуют тем же соглашениям, что и конвейер активов.

Ответ 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 = %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 на вопрос о кофе-рейках № 36)