Ruby on rails 构造多页表单以在数据库中创建和编辑模型的最佳方法是什么?

Ruby on rails 构造多页表单以在数据库中创建和编辑模型的最佳方法是什么?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我对Rails还相当陌生 在Rails中设计/构造多页表单的最佳方法是什么?我希望表单在提交表单的第一页时立即在数据库中创建一个新记录,并为表单的每个后续页面更新数据库中的记录 我希望在提交第一页后立即创建记录的原因是,这样就可以有一个未完成记录的概念,用户稍后会返回以完成该记录 创建之后,我希望允许用户通过直接转到该部分来编辑模型的任何部分 我对Rails有足够的了解,如果您能用最好的方法从概念上指导我,我应该能够自己理解代码 谢谢。Ryan Bates在他的一个Railscasts=>中解释

我对Rails还相当陌生

在Rails中设计/构造多页表单的最佳方法是什么?我希望表单在提交表单的第一页时立即在数据库中创建一个新记录,并为表单的每个后续页面更新数据库中的记录

我希望在提交第一页后立即创建记录的原因是,这样就可以有一个未完成记录的概念,用户稍后会返回以完成该记录

创建之后,我希望允许用户通过直接转到该部分来编辑模型的任何部分

我对Rails有足够的了解,如果您能用最好的方法从概念上指导我,我应该能够自己理解代码


谢谢。

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。实际上,我最终做了一些与您描述的非常相似的事情。只是添加一个我将尝试的选项卡式表单帮助器-