Jak się tworzy zaawansowane formy

Witam!

Zaczynam przygodę z Railsami i miałem pomysł na stworzenie pewnej apki w ramach nauki. Ale na etapie planowania natrafiłem na problem z głównym elementem tej apki.

Chciałbym, żeby grupa uprzywilejowanych użytkowników mogła tworzyć formy, z których z kolei korzystaliby zwykli użytkownicy. Nie byłoby problemu, gdyby elementy formy były samodzielne (np. para pytanie - odpowiedź, zwykły checkbox, label, itp.). Zrobiłbym to tak, że user z listy mógłby wybrać typ elementu do dodania i kliknąć przycisk, aby to zrobić. Jakoś bym to w bazie danych przedstawiał, a z pomocą JSa ładnie bym mu odświeżał na bieżąco co trzeba.

Ale ja chcę, żeby ten uprzywilejowany user był w stanie dodać różne relacje między dodanymi elementami. Np.: “kliknięcie danego checkboxa powoduje, że pozostałe checkboxy robią się szare i nie można ich już zaznaczyć”. Albo: “zwiększenie danego licznika o 1 powoduje zmniejszenie innego licznika o 1”. Fajne byłyby też bardziej skomplikowane, typu: “kliknięcie danego checkboxa powoduje, że pozostałe robią się szare, ale tylko pod warunkiem, że jeszcze 2 inne checkboxy są kliknięte”.

Jak się za to zabrać? Miałem różne pomysły. Jako że użytkownicy są uprzywilejowani, może mógłbym pozwolić im dodać jakiś skrypt do każdego elementu? Albo może utworzyć listę możliwych relacji. Obok każdego elementu byłaby rozwijana lista z tymi relacjami. Przykładowo po dodaniu do checkboxa relacji o nazwie “changes value of … to …” pojawiłyby się obok 2 pola. W jednym można by wpisać numer elementu do zmiany, a w drugim wartość, jaką ma przyjąć.

Proszę o pomoc, sugestie, pomysły. Zrobiłem już 2 aplikacje na poziomie tej z railstutorial.org i chyba czas za coś mądrzejszego się zabrać. Ale jak tylko wymyśliłem jakiś ciekawszy ficzer, nie wiem jak go ugryźć…

Stwórz różne klasy dla rodzajów fieldów (checkbox, text etc) oraz w ich “module” typy (relacja, event), a następnie wszystko dynamicznie rzutuj na dana klasę, gdzie ta będzie zwracać templatkę do wyrenderowania oraz strukturę jsona, którą user by wypełniał (np to pole ma wywołać event na innym polu) i to wszystko byś trzymał w bazie jako json.

Ogólnie wybrałeś sobie zabawną aplikację na pierwszy raz : )