使用js.erb文件中的jquery渲染部分给出错误。渲染不是一个功能

时间:2014-08-06 10:51:53

标签: ruby-on-rails ruby ruby-on-rails-4

下面的

是文件“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渲染部分的整个过程中我缺少什么。

2 个答案:

答案 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

在您将用于渲染该部分内容的新操作中。