【问题标题】:What is the best way to structure a multi-page form to create and edit models in a database?构建多页表单以在数据库中创建和编辑模型的最佳方法是什么?
【发布时间】:2010-09-01 15:12:32
【问题描述】:

我对 Rails 还很陌生。

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

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

创建后,我希望允许用户直接进入该部分来编辑模型的任何部分。

我对 Rails 了解得够多了,如果你用最好的方式来指导我在概念上构建它,我应该能够自己弄清楚代码。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,约翰。实际上,我最终做了与您描述的非常相似的事情。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我实际上偶然发现了这个 Railscast。 Ryan 的方法与我正在寻找的不同。 Ryan 在最后一步写入数据库。我想在第一步之后立即写入数据库,以便如果用户在第一步之后放弃表单,则未完成的记录保留在数据库中。
    • 我觉得还是写在最后一步比较好。这可以保存您的验证。为了存储未完成的记录,您可以使用 cookie 或本地存储。
    • 如果第一页出现验证错误,那怎么办?让用户重新开始?
    【解决方案3】:

    我沿用了这些方面的“多页”表单 - 但它是为 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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多