2011-04-05 48 views
0

我是Rails的新手,正在通过一些书籍工作,编写小型测试项目。我最新的开发应用程序是一个问答程序。这个想法是有一个数据库表充满了问题。用户将调出Web应用程序并显示第一个问题。用户在表单中输入答案,如果答案正确,他会得到下一个问题。很简单。Rails - 这段代码应该在哪里遵守MVC设计?

所以,我用生成的脚手架来创建问题表和用户表。这很好 - 我可以导航到系统生成的视图来添加/编辑/删除问题和用户。

然后我创建了一个名为gateway的新控制器。我做了这个我的根控制器,并给它一个索引方法。索引方法将用户标识作为URL参数提取并为用户提取适当的问题。然后它加载一个显示问题的视图,并具有用户输入答案的表单。

我现在正在编程逻辑来测试答案 - 我在网关控制器中使用名为“test_answer”的新方法执行此操作,但我觉得现在正在打破MVC设计,因为此代码不是直接关系到显示视图。我有点困惑,应该在哪里放这样的代码(方法测试答案,如果正确递增用户的级别,如果错误重定向到错误页面)

它应该在现有模型(用户或问题)?它应该留在网关控制器中吗?我应该在/ lib中创建一个新文件吗?

我得到的MVC(视图中显示的信息,模型存储和处理数据,控制器处理好两者之间的相互作用)的一般概念,但是我不知道这些代码如何适用。

谢谢!

作为参考,这里是我目前的gateway.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 

回答

1

我会把这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 
+0

哪种模式?我有一个用户和一个问题。 test_answer涉及测试与问题数据,但更改(递增)用户数据。好奇听到你的想法,谢谢! – Jim 2011-04-05 18:26:49

+0

我把它放在你的问题模型中,你可以通过调用belongs_to关系来访问用户(假设你有一个belongs_to)。 – 2011-04-05 18:28:46

+0

@user我会把它放在两个,用户模型可能有像'answer_question(问题,答案)'和问题模型可能有'答案(答案)' – Vadim 2011-04-05 18:31:46

相关问题