2016-12-02 7 views
0

expensesは複数のexpense_typesを持ち、各expense_typeは複数の特定のフィールドを持つフォームを持っています。 expenseを作成する際にRails 5.0 - ネストされたフォームを動的にレンダリングする方法は?

、私はそれを持っているであろうexpense_type選択することができ、およびAJAXを通じて私はfields_for選択expense_typerenderしたいと思います。 expense_typetravelを選択すると、それはまた、フィールドitinerary、ページ上のstart_date/end_dateが含まれています。たとえば

、のexpenseが人のnameexpense_costを持っているとしましょう

私はexpenseフォーム内で、選択したexpense_typesのいずれかをレンダリングするために次のコード行があります:私は@expense_type = params[:selected_expense_type]を設定し、:newをレンダリングするためにそれを伝えるために、アクションを呼び出す場合「、それを

<% 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の現在のフォームデータを失うことなくこの変数を設定するにはどうすればよいですか?おそらくこれを行うためのより良い方法はありますか?

ありがとうございます!

答えて

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を選択すると、現在のフォームのcoを使用してexpenses/newにリクエストが送信されます(expense_expense_types/expense_type_form)と一致する部分を探して、それがレンダリングされている場合はそれをレンダリングするだけでなく、@expenseオブジェクトを古い値で設定します。

関連する問題