2016-12-02 25 views
0

我有expenses其中有多個expense_types,並且每個expense_type具有多個特定字段的形式。Rails 5.0 - 如何動態呈現嵌套表單?

在創建一個expense,我可以選擇expense_type就會產生,並通過AJAX我想renderfields_for選擇expense_type

例如,假設一個expense有一個人的nameexpense_cost:當選擇expense_typetravel,還包括場itinerary在頁面上start_date/end_date

我有下面幾行代碼,以提供任何所選擇的expense_types中,expense形式中:

<% if @expense_type.present? %> 
    <%= f.fields_for ("expense_#{@expense_type}").to_sym do |ff| %> 
    <%= render "expense_#{@expense_type.pluralize}/#{@expense_type}_form", f: ff %> 
    <% end %> 
<% end %> 

如果我打電話的動作設定@expense_type = params[:selected_expense_type],然後告訴它渲染:new,它將按照預期顯示選定的表單,但是我將丟失用戶已經提供的數據。

如何在不丟失expense的當前表單數據的情況下設置此變量?有沒有更好的方法來做到這一點?

謝謝!

回答

0

的解決方案是通過AJAX發送當前表單的內容,並用它設置expense對象,然後我說這個我ApplicationHelper

def render_if_exists(path, *args) 
    render path, *args 
rescue ActionView::MissingTemplate 
    nil 
end 

,並更新了我的渲染它:

<% if @expense_type.present? %> 
    <%= f.fields_for ("expense_#{@expense_type}").to_sym do |ff| %> 
    <%= render_if_exists "expense_#{@expense_type.pluralize}/#{@expense_type}_form", f: ff %> 
    <% end %> 
<% end %> 

有了這個,我可以單獨加載expense的表單,然後從下拉菜單中選擇expense_type,它會發送一個請求回expenses/new與當前表單的co並設置@expense對象與舊的值,以及尋找一個將符合我的約定(expense_expense_types/expense_type_form),並呈現它,如果它找到一個它的一部分。