2017-10-13 88 views
9

我想實現嵌套模型,這裏是路線文件條目:如何實現遠程:沒有link_to的真正功能?

resources :projects do 
    resources :instances 
end 

以下爲項目負責人的片段:

# GET /projects/new 
def new 
    @project = Project.new 
    @project.instances.build 
end 

和項目的表單視圖:

<%= simple_form_for(@project) do |f| %> 
    ... 
    <%= label_tag :instance_count, "Instance Count" %> 
    <%= select_tag :instance_count, options_for_select([0, 1, 2, 3, 4, 5], 0) %> 
    ... 
<% end %> 

現在,當我更改實例計數的次數時,我需要在上面的表單下多次顯示那些實例字段。以下是部分代碼:

<%= form.simple_fields_for :instances do |i| %> 
    ... 
<% end %> 

基本上我需要從項目的javascript文件中調用<%= render 'instances/form', form: f %>。它應該像鏈接remote: true選項一樣工作。但在這種情況下沒有鏈接,但在更改事件時需要顯示錶單。我應該如何實現這一點?

+0

',更改了號碼,要顯示不同數量的'instances'輸入字段?這是否需要AJAX?也許它只是聽該單擊事件在該網頁上追加一個新的div在該網頁上,當您提交表單,請確保提交適用於這些領域....我想發佈一個答案..添加輸入字段是很棘手的,因爲表單有一個'token',可以避免CSRF,也可以用'Javascript'來執行提交,你需要創建一個jquery'.post()'請求 –

+0

你的觸發器聽到點擊'<%= select_tag:instance_count,options_for_select([0,1,2,3,4,5],0)%>'so'$('#select_tab')。click(// add input div取決於div .value()的結果);',沒有服務器交互。然後,您需要使用此函數在javascript文件中執行'post'請求https://api.jquery.com/jQuery.post/ –

回答

0

因爲instances/form包含只能在服務器端渲染的代碼,所以您必須調用服務器端代碼。
首先,您必須執行ajax調用(例如instance_new_path),然後您必須在該視圖上呈現窗體(instance_new.js.erb)。

例如.js.erb

$("#new_form").html("<%= escape_javascript(render partial: 'instances/form') %>"); 
+0

傳遞表單對象在這裏是棘手的問題(我找到了) - 怎麼會你是否可以使用該部分? – SRack

+0

這必須在控制器上完成,也可以在完整的代碼提供之後進行專門化。 –

0

標準是使部分稱爲app/views/instances/_instance_fields.html.erb。然後,您可以將其加載到您的表單並隱藏。

<%= simple_form_for(@project) do |f| %> 
    <%= render 'instances/_instance_fields %> 
<% end %> 

封面_instance_fields局部用某種容器,如<fieldset class='instance_fields' style='display:none'>。另外,你不應該在那裏使用form對象,只需在那裏使用text_field_tag/checkbox_tag輸入。然後,當您需要添加更多的實例時,您只需複製這些隱藏的片段,並根據需要設置專用名稱(適用於accepts_nested_attributes_for)。

Ping我提供更多的細節和幫助。這是一個在實際項目中使用的方法。每次需要添加更多實例時,都會調用ajax調用並不是最優化的。

+0

我已經在使用'<%= render'instances/form',窗體:f%>'.. –

+0

您需要將這件作品存儲在一些隱藏的模板中,併爲每個新實例複製此模板。複製完成後,您需要使用javascript幫助設置正確的名稱。正確的一些具體的筆記什麼不是在我給你的方法中工作。你不應該使用'from'屬性。在模板的情況下它絕對沒用,因爲你仍然需要在javascript中手動處理輸入'name'屬性 – AntonTkachov

0

我建議你使用https://github.com/nathanvda/cocoon

或者你也可以使用類似的形式給出:呈現在最初的形式部分(與顯示:無),然後取出並保存部分領域用js和克隆它們形成時選擇被擊中。

0

創建.js文件,並加載它裏面projects/new.html.erb,每當有select值的變化產生了post請求instances/new控制器,將在每次被擊中時呈現instances/new.js.erb將執行。

# GET /instances/new 
def new 
    @f = Instance.new 
end 

實例/ new.js.erb

$('#instance-form-wrapper').append(<% escape_javascript(render 'instances/form', form: @f) %> 

負載。JS

$(document).on('change', 'select#some-id-name', function(){ 
    var v = $(this).val(); 
    $('#instance-form-wrapper').html('') ; 
    while(v--) $.post('/instances/'); 
}) 

但應這樣不使用。在您的代碼中已加載一個instance字段,請將其隱藏,因爲您的project中已有instance。另外,每次渲染時都不需要任何新數據。只需選擇值1,您可以show您的instance字段,如果值爲> 1,則可以使用clone進一步複製它。 [:instance_count]