Rails 5.0 - 如何动态呈现嵌套表单?

时间:2016-12-02 18:39:10

标签: javascript jquery ruby-on-rails ajax

expenses有多个expense_types,每个expense_type都有一个包含多个特定字段的表单。

创建expense后,我可以选择它将具有哪个expense_type,并通过 AJAX 我想render fields_for expense_type 1}}所选的expense

例如,让我们说name有一个人expense_costexpense_type:选择travel itinerary后,它还包括页面上的字段start_dateend_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,它会按预期显示所选表单,但我会丢失数据用户已提供。

如何在不丢失ArticleTitle当前表单数据的情况下设置此变量?有没有更好的方法来做到这一点?

谢谢!

1 个答案:

答案 0 :(得分: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后,它会将请求发送回{{ 1}}使用当前表单的内容并使用旧值设置expenses/new对象,以及查找与我的约定(@expense)匹配的部分,并在它找到了一个。