是文件“app_erb.js.erb
”
$(function(){
$('.add_more_element').click(function(e){
e.preventDefault();
$(this).siblings('.remove_this_element').show('slow');
$(this).hide('slow');
$(this).closest('.form-group').add('<%=j render 'resumes/resume_certification' %>');
});
});
我有部分views/resumes/_resume_certification.html.erb
但是当我加载我的应用程序时,它给了我 NoMethodError at / resume / new undefined方法`render'。
在使用javascript渲染部分的整个过程中我缺少什么。
答案 0 :(得分:2)
<强> JS 强>
我认为您遇到的问题是您尝试从资产管道中加载ERB
/ Rails
方法。
虽然documentation确实说你可以在资产管道中使用ERB预处理,但是如何实现此功能却很少:
资产管道提供了连接和缩小的框架 压缩JavaScript和CSS资产。它还增加了写作能力 这些资产用其他语言和预处理器如 CoffeeScript,Sass和ERB。
我的理解是,在您的资产管道中直接包含ERB / Rails代码是一种禁忌,因为它带来的动态复杂性(至少这是我的经验)。相反,你会希望让你的JS尽可能“原生”
-
<强>的Ajax 强>
其次,你必须意识到一些非常重要的东西--Javascript是前端的。它旨在将事件绑定到您的DOM
元素,而不直接与Rails后端交互。
因此,您将需要使用AJAX从服务器提取所需的数据:
#config/routes.rb
resources :resumes do
collection do
get :resume_certification
end
end
#app/controllers/resumes_controller.rb
Class ResumesController < ApplicationController
def resume_certification
render "resumes/resume_certification"
end
end
#app/assets/javascripts/app.js
$(function(){
$(document).on("click", ".add_more_element", function(e){
e.preventDefault();
$(this).siblings('.remove_this_element').show('slow');
$(this).hide('slow');
$.get( "resumes/resume_clarification", function( data ) {
$(this).closest('.form-group').add(data);
});
});
});
答案 1 :(得分:1)
我看到的最佳选择是避免将部分直接加载到字符串中,而是通过ajax加载所述页面(这也可以避免在调用函数之前加载所述部分而不使用它!)
$(function(){
$('.add_more_element').click(function(e){
e.preventDefault();
el = $(this);
el.siblings('.remove_this_element').show('slow');
el.hide('slow');
$.get("<%= resume_certification_path %>", function(data) {
el.closest('.form-group').add(data);
});
});
});
我用新的var替换$(this)以避免在ajax调用中出现混乱。显然,此解决方案要求您创建新的获取路径,并设置
render :layout => false
在您将用于渲染该部分内容的新操作中。