Ugh – not sure why I’m having so much trouble with this.
Writing a simple question and answer app (see Rails – Where should this code go to stay true to MVC design? for some details)
Trying to stick to MVC principles and proper design – this app is simply a learning experience, so I want to make sure I’m doing things in a generally accepted way
The referenced question gave me advice to split up my functionality into the different models. However, trying to implement this, I find myself passing parameters all over the place and I just get a feeling that I’m not doing something right. So, here’s the basic layout of the app and the tasks I am trying to accomplish – if someone could let me know if I’m on the right track…
Question Model: contains id(pkey), question_number(int), question_text(string), answer_text(string)
User Model: contains: id(pkey), uid(string), current_question(int), name(string)
I created both of the above with scaffold so they have all the default routes, controller actions, etc…
I created a gateway controller and set it to be my default page through routes.rb
The idea is, user browses to localhost:3000/?uid=”whatever” and the index page displays the current question (Question.find_by_question_number(@user.current_question))
User enters answer in a form, which POSTs it to an action. In my first draft, this called an action in the gateway controller which checked if the answer was correct.
Now, I am trying to take vadim’s advice in my last question and keep the user login in user and the question logic in question. So now my form POSTs to the users controller.
Here’s where I get mixed up. The logic code shouldn’t be in the controller, right? So I call a method in the model, passing it stuff like the user’s answer and the question id since I can’t read the session in the model. This works fine, I can now take care of the logic in the user model – so now the user model calls a method in the question model to actually check the answer. That means I have to instantiate my question object using the ID I passed, then call another method, passing (again!) the answer. Etc…etc…
See what I mean? I definitely understand the value of MVC in theory, but whenever I try and implement it I wind up with a mess like this. It this correct, and it just seems like overcomplicating things because my program is so simple?
Can someone walk me through how you would split the logic up? You don’t need to post actual code, just what you would put where, like:
Gateway Controller:
-display question to user
-take answer and pass to XXX controller
XXX controller:
-call method Foo in XXX model, passing X and Y
The basic flow should be, user is shown a question, user answers question, answer is compared to the correct answer in the question model, message is returned based on result, and it answer was correct, user’s current_question is incremented.
Thanks so much for the help, I have books and Google and have been reading my a$$ off, just lost in the sauce here. This is my first attempt to venture outside the safety of pre-written example code, so please be gentle!!
Thanks!!
The basic flow should be:
Now to the model. You can put methods in there that check certain things. Still, the controller handles the work, it calls the method and processes the results in the controller.