我expenses
有多个expense_types
,每个expense_type
都有一个包含多个特定字段的表单。
创建expense
后,我可以选择它将具有哪个expense_type
,并通过 AJAX 我想render
fields_for
expense_type
1}}所选的expense
。
例如,让我们说name
有一个人expense_cost
和expense_type
:选择travel
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
,它会按预期显示所选表单,但我会丢失数据用户已提供。
如何在不丢失ArticleTitle
当前表单数据的情况下设置此变量?有没有更好的方法来做到这一点?
谢谢!
答案 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
)匹配的部分,并在它找到了一个。