2011-06-15 113 views
1

我基本上把一個應用程序做了一個超級簡單的問題=>回答測試,試圖瞭解更多關於rails的內容。如何堅持使用REST?

ie: 問題:「你的狗叫什麼名字?」 答:「Doggington」

我有兩個簡單的屬性的問題型號: 問題:字符串 correct_answer:字符串

我在這裏的鬥爭是如何申請REST校長這一點 - 特別是,當我我正在檢查用戶的輸入(答案),看看他是否正確回答了問題。

我不確定是否應該修改「顯示」方法(或任何其他操作)以接受發佈給它的值的值......並且它似乎應該在我的應用程序中創建一個新方法questions_controller稱爲「verify_answer」或長這些行。

這打破了REST。

您認爲如何?

謝謝!

回答

5

AnswersController#create應該接受答案。這個控制器是否實際上有一個相關的答案模型是無關緊要的。一個動作應該從不執行兩個動作。例如,如果您的QuestionsController#show都顯示該問題,則接受:put:post並回答問題,則說明您打破了基本的導軌設計原則。

請注意,你的路由文件很可能會是這樣的:

resources :questions do 
    resource :answer 
end 

這將暴露/問題/ 8 /回答路線,你可以:帖子,這將去AnswersController#create

關閉我的頭頂我忘記了可用於生成url的助手url方法的確切名稱。類似於question_answer_path(@my_question)。

此路由文件是Rails3中,我以爲是你使用的是什麼,因爲沒有理由去使用別的,如果你開始在我看來,一個新的應用:對

如果你有一個Answer模型(也許你想存儲用戶的答案,稍後看看或聚合它們,並拿出統計數據等),那麼你應該改變路由器使用resources :answer而不是單數版本。

有關路由和你應該訪問on Rails的Ruby的指導路由一些REST風格的提示信息在這裏找到:http://guides.rubyonrails.org/routing.html

我對編輯大禮包!有些時候,你可能需要添加一個額外的方法到問題控制器,而不是嚴格的REST。這不一定被認爲是不好的做法,但只要確保你看看你的決定,並確定你是否真的隱藏了另一種資源的存在。我不認爲這是上述時間之一:)

+0

不能夠感謝你。你的回答非常明確,而且生病了。 – 2011-06-15 20:43:23

+0

後續問題:如果問題模型包含問題和答案,那麼我假設我的'AnswersController#create'應該查詢數據庫並找出被問詢的「問題」的「答案」。我如何訪問問題的ID,以便我可以在'AnswersController#create'中查找它?謝謝! – 2011-06-15 23:02:43

+0

那麼這就是在'questions'裏嵌套資源的美妙之處(正如在路由指南中指出的,一條經驗法則是永遠不會超過1層深)。由於動作是通過類似'/ questions/8/answer'的方式訪問的,因此路由器會自動爲您提供question_id。在'AnswersController'的'create'動作中用'params [:question_id]'訪問它。因此,在這個動作中:'Question.find(params [:question_id])'應該做到這一點。 – nzifnab 2011-06-15 23:21:34