Mario Zigliotto
Mario Zigliotto

Reputation: 9015

How to stick with REST?

I'm basically putting together an app that does a super simple question => answer test in an attempt to learn more about rails.

ie: Question: "What's your dog's name?" Answer: "Doggington"

I have a Question model with two simple attributes: question:string correct_answer:string

My struggle here is how do i apply REST principals to this -- specifically, when i am checking a user's input(answer) to see if he got the question right or not.

I'm not sure if i should do something like modify the "show" method (or any other action) to accept values for answer posted to it... and it SEEMS like I should create a new method in my questions_controller called "verify_answer" or something a long those lines.

This breaks REST.

What do you think?

thanks!

Upvotes: 1

Views: 168

Answers (1)

nzifnab
nzifnab

Reputation: 16092

AnswersController#create should accept the answers. Whether or not this controller actually has a related Answer model is irrelevant. One action should never perform two actions. For instance, if your QuestionsController#show both displays the question, and accepts a :put or :post with the answer to the question then you are breaking basic rails design principals.

Note that your routes file might very well look like this:

resources :questions do
  resource :answer
end

Which will expose the /questions/8/answer route that you can :post to, which will go to AnswersController#create.

Off the top of my head I'm forgetting the exact name of the helper url method you can use to generate the url. Something like question_answer_path(@my_question).

This routing file is for rails3, which I assume is what you're using since there's no reason to use anything else if you're starting a new app in my opinion :p

If you do have an Answer model (maybe you want to store users' answers and look at them later or aggregate them and come up with statistics and such) then you should change the router to use resources :answer instead of the singular version.

For more information about routing and some RESTful tips you should visit the Ruby on Rails guide for routing found here: http://guides.rubyonrails.org/routing.html

I'm on an editing spree! There are times when you might need to add an additional method to your Questions controller that isn't strictly REST. This isn't necessarily considered bad practice but just make sure you look at your decisions and find out if you aren't actually just hiding the existence of another resource. I don't consider this to be one of those times as explained above :)

Upvotes: 5

Related Questions