Rails — та же модель/контроллер, но другой вид

Я создаю мастер форм, который направляет пользователя через уже созданную и развернутую форму. Модель и контроллер должны остаться прежними, поскольку единственное изменение — это представление (проводящее пользователя через каждое поле формы). Каков наилучший (и самый простой, если возможно) способ выполнения этой задачи?

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

Любые предложения действительно ценятся. Спасибо!


person webren    schedule 02.05.2011    source источник


Ответы (2)


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

  • Простой способ — создать действие мастера в контроллере формы. Сделайте так, чтобы действие мастера визуализировало представление мастера.
  • Лучший способ — создать контроллер мастера и сделать его подклассом контроллера формы. Переопределите новое действие и визуализируйте представление мастера. Это более предпочтительный метод, потому что базовые действия CRUD в Rails получают REST бесплатно. Таким образом, следуя этому методу, вы получите мастер RESTful.
person webren    schedule 05.05.2011

Вам обязательно стоит заглянуть сюда:

http://railscasts.com/episodes/217-multistep-forms

В противном случае, чтобы ответить коротко, вы можете указать любому действию вашего контроллера отображать любое представление, которое вы хотите. Это то, что делается в базовом контроллере каркаса:

render :edit
person apneadiving    schedule 02.05.2011
comment
@apneadiving Вместо создания подкласса исходного контроллера (назовем его контроллером формы) я мог бы просто создать контроллер FormWizard, который является подклассом ApplicationController. Оттуда я могу указать, какие действия я хочу, чтобы FormWizard имел, причем каждое действие может отображать определенное представление. Хороший ли это подход? Как связать новый контроллер/представления с моделью формы? - person webren; 04.05.2011
comment
@apneadiving С точки зрения привязки контроллера FormWizard и представлений к модели формы, я думаю, это так же просто, как создать переменную экземпляра в контроллере FormWizard и заставить его извлекать и отправлять данные через Active Record. - person webren; 04.05.2011
comment
Это способ продолжить, но я не уверен, что это необходимо по двум причинам: 1) обычно мастера не сохраняют модель между двумя страницами, а только в конце формы, это их цель, и скринкаст успешно это демонстрирует 2) у мастера должен быть только один URL. В противном случае вы пишете многостраничную форму, что тоже хорошо :) - person apneadiving; 04.05.2011
comment
@apneadiving Видео - это не то, что я пытаюсь сделать. Мой проект имеет двухстраничную форму. Моя цель — создать раздел мастера на веб-сайте, который приведет пользователя к той же форме, но с всплывающими подсказками, проводящими пользователя через всю форму. Когда пользователь вводит информацию в мастер, он по-прежнему сохраняет данные в базе данных, как если бы они заполняли исходную форму (без мастера/подсказок). Единственное, что меняется, — это вид (интерактивность JavaScript, CSS). Имеет ли это смысл? Я ценю любые отзывы или любые предложения. - person webren; 04.05.2011
comment
Хорошо понял. Так что ладно, создайте действия и представления для каждой страницы и, если возможно, выполните рефакторинг между wizzarf и обычной формой :) - person apneadiving; 04.05.2011
comment
На самом деле, это намного проще, и ваш исходный пост намекает на это. Я просто создаю действие мастера в контроллере, и это действие отображает представление мастера. - person webren; 04.05.2011