Каков наилучший способ структурировать многостраничную форму для создания и редактирования моделей в базе данных? - PullRequest
4 голосов
/ 01 сентября 2010

Я довольно новичок в Rails.

Как лучше всего спроектировать / структурировать многостраничную форму в Rails? Я хотел бы, чтобы форма создавала новую запись в базе данных сразу после отправки первой страницы формы, и для каждой последующей страницы формы обновляла эту запись в базе данных.

Причина, по которой я хочу, чтобы запись была создана сразу после отправки первой страницы, заключается в том, что может существовать понятие незаконченной записи, к которой пользователь возвращается позже, чтобы закончить.

После создания я хотел бы разрешить пользователю редактировать любую часть модели, перейдя непосредственно в этот раздел.

Я знаю достаточно Rails, и если вы укажете мне лучший способ структурировать это концептуально, я сам смогу разобраться в коде.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 02 сентября 2010

У меня есть многоэтапный процесс регистрации, который работает таким образом. Я создаю запись в первый раз, а затем выполняются другие действия по редактированию / обновлению этой записи. Я использую несколько контроллеров для этого; это гораздо более чистый подход, чем пытаться втиснуть всю логику в одно действие контроллера (хотя вы можете использовать несколько действий с одного контроллера, и это будет работать так же хорошо, но не забудьте создать маршруты для своих пользовательских действий). Этот подход усложняет проверку данных, добавляемых поэтапно после первого шага, но вы всегда можете добавить свои собственные ошибки, вызвав в своей модели error.add, по сути, выполнив собственные проверки. Вы также можете написать логику в контроллере сессий, чтобы направить пользователя к тому же шагу в многоэтапной форме, если он вернется позже и не завершит его.

5 голосов
/ 01 сентября 2010

Райан Бейтс объясняет это в одном из своих Railscasts => MultiSteps Forms

0 голосов
/ 06 сентября 2010

Я унаследовал «многостраничную» форму в том же духе - но она была построена для 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...