How to create a dynamic form for Contest/Giveaway app
I've got two models, Contest (has many entries) and Entry (belongs to contest). When I create a contest I want to be able to add some questions that would be dynamically added to the entry form... How would I data model this? Do I also add a Question model that belongs to both Contest and Entry? I'm not sure how to do this..
Oh boy, the world of dynamic forms. Are you planning on having different types of Questions (like short answer, multiple choice)?
For the simplest thing, if I assume that each Question has the same type of answer (say they are all short answer), you can create an Entry with nested Answer records. Each Answer belongs_to a Question and also belongs_to Entry. You can then generate the form and dynamically add fields_for :answers for each of the questions and save the answers as part of the Entry (and validate them).
It gets more complicated if you want different types of questions though. Might check this out: http://vysakh0.github.io/complex-dynamic-forms-in-rails/
Haha I definitely understand the "oh boy" sentiment. I've never had to make anything this complex in Rails before (and I doubt it's even relatively complex) and it's totally tripping me up. I don't really know a lot about embedding other model's data into forms so it sounds like I have my work cut out for me. I'm not sure we will be doing different answers to questions. I was thinking that we'd start with simple yes or no type questions and just rock booleans (I will probably need to allow other types of questions in the future though). I think I understand what you are saying though... So I will have 4 models: Contest, Entry, Question, and Answer. When I create the Contest, I will also create Questions for that Contest (Question belongs to Contest) (Ugh.. I guess I'll also have to have a dynamic form when creating a contest). The Entry has many Answers records which belong to a Question. But the Question does not belong to the Entry right? It only belongs to the contest?
Dang, this app seems like it might be a real challenge for me to make. Hopefully I'll be able to figure it out. I'll check out that article and see if I can swing it.
Don't worry, it's definitely a complex thing to wrangle. Not only do you have to deal with nested forms, but you also have to dynamically generate forms.
You can set a question_type
attribute on Question to the string of boolean
so that int the future you can use that attribute to determine what format of answer you need to record. As for recording answers, you may want to do something like a generic text field and then parse the result into a boolean so that you can easily add things like short answer questions later without having to update the Answer format.
The 4 models should be all you need and I'd recommend using something like Cocoon for making the Contest which would let you dynamically add more Questions to it. You won't need it for Entry because you'll know the questions and just need to generate one Answer per Question in the Contest to save with the Entry.
Your models should probably look something like this:
Contest
- has_many :questions
- has_many :entries
Question
- belongs_to :contest
- has_many :answers
Entry
- belongs_to :contest
- has_many :answers
Answer
- belongs_to :entry
- belongs_to :question
I hadn't heard of Cocoon before, I'll check it out! Thanks for laying out those models for me. I went and watched the railscast on nested and dynamic forms and things are seeming to be a little clearer.. I'll keep working on it.
Yes, I think a screencast on this would be awesome!!
Thanks for your help!
ActionForm might suits your needs.
As the Rails team is taking over it, it would be great if @excid3 make a screencast about it.
I definitely need to cover ActionForm soon. I'm glad the Rails core team members are actively working on it.
I created a extendable gem to solve dynamic form problem
https://github.com/rails-engine/form_core
I'm not done doc yet, but It has a full-featured dummy app for evolution that can create forms, fields (including nested fields to support like shopping list), attachment uploading is also support by integrate with ActiveStorage