2014-11-21 54 views
-1

我有一个main.js.erb,看起来像这样:如何在.js.erb文件中执行模式的js渲染?

$(document).on("page:change", function(){ 
    MainJS.init(); 
    $("#add-video-step-1").html("<%= escape_javascript(render 'videos/upload_video') %>"); 
    $('#myModalLabel').modal(show); 
    Ladda.bind('#video-submit'); 
    console.log("Upload.js.erb has been executed"); 

}); 

基本上我希望发生的是,每当与ID #video-submit按下按钮,我希望它执行的模式是在部分videos/upload_video

只是在做一个普通render 'videos/upload_video'我想应该足够了,但是当我尝试这个,我得到这个错误:

NoMethodError at/
undefined method `render' for #<#<Class:0x007f916fcf1310>:0x007f91721a9c20> 
    (in /app/assets/javascripts/main.js.erb) 

在这一行:

$("#myVCModal").html("<%= escape_javascript(render 'videos/upload_video') %>"); 

的思考?

编辑1

下面是部分的代码,每乌代的要求 - 即video/_upload_video.html.erb

<div class="bootstrap-styles"> 
<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
    <h3 id="myModalLabel">Upload your Video</h3> 
    <p><i>Step 2 of 2 - TEST</i></p> 
    </div> 
    <div class="modal-body"> 
    <div class="form"> 
     <%= form_tag @upload_info[:url], :multipart => true do %> 
     <div>Step 2 of 2</div> 
     <%= hidden_field_tag :token, @upload_info[:token] %> 
     <%= file_field_tag :file, title: 'Choose video to upload' %> 
     <p class="uploader"> 
      <button class="btn btn-success ladda-button" data-color="green" data-style="expand-left"><span class="ladda-label">Upload Video</span><span class="ladda-spinner"></span></button> 
     </p> 
     <% end %> 

    </div> 
    </div> 
    <div class="modal-footer"> 
    </div> 
</div> 
+0

根本问题是为什么你把'main.js.erb'放入资产中? ERB模板不以任何方式属于资产的一部分,不应该在那里使用。我只是不明白它背后的想法。你能详细说明一下吗? – blelump 2014-11-24 11:51:19

+0

那么我刚开始只是'main.js'。然后我面临的问题是我需要能够渲染这些JS模式,所以我才开始这样做。唉,我们在这里。 – marcamillion 2014-11-24 18:22:55

+0

有两种处理模态的方法。一种是将模态嵌入到ERB视图中,然后通过$('#myModalLabel').model(show);'显示出来。另一种是从给定动作中动态加载模态。在这种情况下,'get:action as HTML'应该加载对话框,'put/patch:action作为JS/JSON'应该保持它提供的数据。应该使用哪种方法以及何时使用?这取决于用例。大量使用的模式可以通过视图提供给用户,其他人可以按需加载。 – blelump 2014-11-24 21:51:07

回答

1

你得到错误,因为renderviews (ActionView)的方法和你想它在资产不可用的地方。因此,要使它工作是我们应该做的是初始化ActionView并为您的main.js.erb应该是这样的:

$(document).on("page:change", function(){ 
    MainJS.init(); 
    <% action_view = ActionView::Base.new(Rails.configuration.paths["app/views"].first) %> 
    $("#add-video-step-1").html("<%= action_view.escape_javascript(action_view.render 'videos/upload_video') %>"); 
    $('#myModalLabel').modal(show); 
    Ladda.bind('#video-submit'); 
    console.log("Upload.js.erb has been executed"); 

}); 

我只是尝试它和它的工作对我来说,给它一个尝试,并知道它是否适合你或不:)


对于Ajax请求,并呈现局部的事情,你可以简单地发送一个Ajax请求到controlleraction把下面的代码中对应的视图文件(action.js.erb):

$("#add-video-step-1").html("<%= escape_javascript(render 'videos/upload_video') %>"); 
$('#myModalLabel').modal(show); 
+0

这感觉像一个哈克的方法。有没有更标准的Rails方式来做到这一点? – marcamillion 2014-11-24 01:43:59

+0

这是哈克。标准的方式可以是你可以向一个动作发出ajax请求,然后渲染这个局部&代码,或者你可以在你想要的页面上渲染这个代码,并使其隐藏(隐藏),然后当按钮/链接是点击你可以显示它。让我知道什么适合你,我可以相应地修改答案 – manoj2411 2014-11-24 01:51:56

+0

我更喜欢ajax请求并呈现该部分和代码。 – marcamillion 2014-11-24 05:54:46