2014-11-21 101 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