Ruby on rails 构造多页表单以在数据库中创建和编辑模型的最佳方法是什么?
我对Rails还相当陌生 在Rails中设计/构造多页表单的最佳方法是什么?我希望表单在提交表单的第一页时立即在数据库中创建一个新记录,并为表单的每个后续页面更新数据库中的记录 我希望在提交第一页后立即创建记录的原因是,这样就可以有一个未完成记录的概念,用户稍后会返回以完成该记录 创建之后,我希望允许用户通过直接转到该部分来编辑模型的任何部分 我对Rails有足够的了解,如果您能用最好的方法从概念上指导我,我应该能够自己理解代码Ruby on rails 构造多页表单以在数据库中创建和编辑模型的最佳方法是什么?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我对Rails还相当陌生 在Rails中设计/构造多页表单的最佳方法是什么?我希望表单在提交表单的第一页时立即在数据库中创建一个新记录,并为表单的每个后续页面更新数据库中的记录 我希望在提交第一页后立即创建记录的原因是,这样就可以有一个未完成记录的概念,用户稍后会返回以完成该记录 创建之后,我希望允许用户通过直接转到该部分来编辑模型的任何部分 我对Rails有足够的了解,如果您能用最好的方法从概念上指导我,我应该能够自己理解代码 谢谢。Ryan Bates在他的一个Railscasts=>中解释
谢谢。Ryan Bates在他的一个Railscasts=>中解释了这一点。我有一个多步骤的注册过程,就是这样工作的。我第一次创建记录,然后其他步骤是编辑/更新该记录。我为此使用多个控制器;这是一种比试图将所有逻辑塞进一个控制器动作更干净的方法(尽管您可以使用来自同一个控制器的多个动作,而且效果也一样,但不要忘记为自定义动作创建路由)。这种方法使得在第一步之后的步骤中添加的数据的验证更加困难,但是您始终可以通过调用errors.add来添加您自己的错误,基本上是滚动您自己的验证。您还可以在会话控制器中编写逻辑,以引导用户返回到多步骤表单中的同一步骤,前提是他们稍后返回并且尚未完成该步骤。我继承了一个“多页”表单,但它是为Rails 2.2构建的,我只是在调整Rails 3的方法 基本上,我们使用了一个选项卡式布局,将整个表单放在一个视图中——尽管在Rails 2.2中,这种方法对一个控制器的权重很大,但我认为可以更好地分解它 布局意味着表单的每个部分都可以通过选项卡访问,但是每个选项卡部分也有一个链接,指向下一部分的操作,在该部分的底部(例如,a部分->B部分)每次你移动到一个新的部分时,这就保存了整个表单-我对视图进行了大量编辑只是为了给出一个想法,但是如果它是一个新表单,它只会在按下每个部分的提交按钮后显示每个部分
<ul id="tabs">
<li><a href="#SectionA">Section A</a></li>
<li><a href="#SectionB">Section B</a></li>
<li><a href="#SectionC">Section C</a></li>
<li><a href="#SectionD">Section D</a></li>
<li><a href="#SectionE">Section E</a></li>
<li><a href="#SectionF">Section F</a></li>
<li><a href="#SectionG">Section G</a></li>
<li><a href="#SectionH">Section H</a></li>
<li><a href="#SectionI">Section I</a></li>
<li><a href="#SectionJ">Section J</a></li>
</ul>
<%=hidden_field_tag 'active_fabtabulous_tab'%>
<% form_for(@detail) do |f| %>
<%= f.error_messages %>
<div class="panel" id="SectionA">
<b><u>Section A: Questionnaire Details</u></b>
<br></br>
<table>
<tr>
<td><div id="field_name">Questionnaire received on (dd/mm/yyyy):</div></td>
<td><%= date_select("questionnaire", :received_on, :order=>[:day,:month,:year],:use_month_numbers=>true,:start_year=>Date.today.year,:end_year=>2008,:include_blank => true) %></td>
</tr>
<tr>
<td><div id="field_name">Interviewer name:</div></td>
<td><%=text_field("questionnaire",:intervieweename)%></td>
</tr>
</table><!-- end questionnaire div -->
<%= f.submit "SectionB" , :class => "questButton" %>
</div>
<!--- Page 2 --->
<div class="panel" id="SectionB">
<b><u>Section B: Case Classification</u></b>
<br></br>
<% fields_for :patient, @patient do |p| %>
<table>
<tr>
<td class="sectionA_is_this_case"><div id="field_name">Epidemiology definition:</div></td>
<td><%= @patient.epidef %>
</td>
</tr>
</table>
<% end %>
<table>
<tr>
<% fields_for :patient, @patient do |p| %>
<td><div id="field_name">Asymptomatic:</div></td>
<td><% if @patient.asymptomatic %>Yes<% else %>No<% end %></td>
<% end %>
<tr>
<tr>
<td><div id="field_name">Investigation is:</div></td>
<td><%=select("detail", "invstatus", INVESTIGATION_IS)%></td>
</tr>
<tr>
<td><div id="field_name">Outbreak keyword or number:</div></td>
<td><%= f.text_field :outbreakid ,:cols => 40, :rows => 1 %></td>
</tr>
</table>
</div>
<%= f.submit "SectionC" , :class => "questButton" %>
</div>
A部分:问卷详情
于(年月日)收到的调查问卷:
[:day,:month,:year],:use_month_number=>true,:start_year=>Date.today.year,:end_year=>2008,:include_blank=>true)%>
采访者姓名:
“任务按钮”%>
B节:案件分类
流行病学定义:
无症状:
是的
调查是:
爆发关键字或编号:
40,:行=>1%>
“任务按钮”%>
谢谢您的回复。事实上,我偶然发现了这个铁路司机。Ryan的方法和我想要的不同。Ryan在最后一步写入数据库。我希望在第一步之后立即写入数据库,这样,如果用户在第一步之后放弃表单,则未完成的记录将保留在数据库中。我认为最好在最后一步写入。这样可以保存验证。为了存储未完成的记录,您可以使用cookie或本地存储。如果第一页上有验证错误,那怎么办?让用户重新开始?谢谢,John。实际上,我最终做了一些与您描述的非常相似的事情。只是添加一个我将尝试的选项卡式表单帮助器-