我是Rails新手,正在阅读几本书,并在此过程中编写小型测试项目。我最新的开发应用是一个问答程序。这个想法是有一个充满问题的数据库表。用户将打开web应用程序,并出现第一个问题。用户在表单中输入答案,如果答案正确,就会得到下一个问题。很简单。
因此,我使用generate scaffold创建了一个问题表和一个用户表。这工作得很好——我可以导航到系统生成的视图来添加/编辑/删除问题和用户。
然后我创建了一个名为gateway的新控制器。我让这个成为根控制器,并给它一个索引方法。index方法接受用户ID作为URL参数,并为用户获取适当的问题。然后,它加载一个显示问题的视图,并有一个用户输入答案的表单。
我现在正在编程逻辑来测试答案-我在网关控制器中的一个名为"test_answer"的新方法中这样做,但我觉得我现在正在破坏MVC设计,因为这段代码与显示视图没有直接关系。我有点困惑,我应该把这样的代码(方法测试答案,如果正确增加用户的级别,如果错误重定向到错误页面)
应该放在现有的模型(用户或问题)中吗?它应该留在网关控制器中吗?我应该在/lib中创建一个新文件吗?
我得到MVC的一般概念(视图显示信息,模型存储和操作数据,控制器处理两者之间的交互),但我不确定如何这段代码适合。
谢谢!
作为参考,这里是我当前的网关。Rb控制器-请把它拆开!我敢肯定里面有很多问题……
class GatewayController < ApplicationController
def index
if params[:uid]
@user = User.where(:uid => params[:uid]).first
else
@user = User.where(:uid => "000").first
end
@question = Question.where(:question_number => @user.current_level).first
session[:uid] = @user.uid
session[:answer] = @question.answer_text
end
# POST /gateway/answer
# POST /gateway/answer.xml
def answer
#below is code I feel shouldn't be here...the logic to test the answer and then increment user's level
if (params[:user_answer]) == session[:answer]
@user = User.where(:uid => session[:uid]).first
@user.increment!(:current_level)
respond_to do |format|
#code here will redirect to "Correct answer" page
end
else
respond_to do |format|
#code here will redirect to "Wrong answer" page
end
end
end
end
我会把test_answer放在模型中,因为它与数据有关。这将返回一个布尔值,然后控制器将在此值上进行比较,以确定是否重定向到错误页面。
半伪代码:
class Question
def test_answer(arg)
if answer_is_right
user.incr_level
else
false
end
end
end
class GatewayController < ApplicationController
#code
def answer
if !question.test_answer(param)
redirect_to error_page_path
end
end
end