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

时间:2010-09-01 15:12:32

标签: ruby-on-rails ruby-on-rails-3

我对Rails很新。

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

我希望在提交第一页之后立即创建记录的原因是,可以存在用户稍后返回完成的未完成记录的概念。

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

我知道足够的Rails,如果你指导我从概念上构建这个概念的最佳方法,我应该能够自己弄清楚代码。

谢谢。

3 个答案:

答案 0 :(得分:6)

我有一个以这种方式工作的多步注册过程。我是第一次创建记录,然后其他步骤是对该记录进行编辑/更新。我为此使用多个控制器;尝试将所有逻辑塞入一个控制器操作中是一种更清晰的方法(尽管您可以使用来自同一控制器的多个操作,但它也可以正常工作,但不要忘记为自定义操作创建路由)。这种方法使得在第一步之后的步骤中添加的数据的验证更加困难,但是您总是可以通过在模型上调用errors.add来添加自己的错误,实质上是滚动您自己的验证。您还可以在会话控制器中编写逻辑,以便在用户稍后返回并且尚未完成时,将用户引导回多步表单中的相同步骤。

答案 1 :(得分:5)

Ryan Bates在他的一个Railscasts中解释了这个=> MultiSteps Forms

答案 2 :(得分:0)

我继承了这些行的“多页”形式 - 但它是为Rails 2.2构建的,我只是为Rails 3调整了这种方法。

基本上我们在一个视图中使用了带有整个表单的选项卡式布局 - 虽然这种方法在Rails 2.2中对一个控制器非常重要,但我认为它可以更好地分解。

布局意味着表格的每个部分都可以通过标签访问 - 但每个标签部分也有一个link_to动作到下一部分,在该部分的底部(例如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>