问题
Using Rails 3.1 jquery_ujs, I have a link with :remote => true, and the controller new action responds with js and render new.js.erb which contains:
$('#post-form').html('<%= escape_javascript(render(:partial => "form")) %>');
It renders the _form.html.erb partial. This works.
Now I want to use Coffeescript, but renaming new.js.erb to new.js.coffee.erb doesn't work. Does the asset pipeline only work in app/assets? What am I doing wrong? Thanks.
回答1:
I had this same issue using Rails 3.1.0. Try renaming your file to just new.js.coffee
. It should still render erb despite not having the extension on the filename.
It's definitely confusing that view templates don't follow the same conventions as the asset pipeline.
回答2:
If you wish to keep the .js.coffee.erb
extension here's a piece of code for Rails 4 to have Rails recognize the file as a valid view template:
# 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
(This is a contribution by cervinka on coffee-rails issue #36)
来源:https://stackoverflow.com/questions/7616097/how-to-render-new-js-coffee-erb-in-app-views