模型-视图-控制器- Rails -这些代码应该放在哪里才能真正符合MVC设计



我是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

相关内容

  • 没有找到相关文章

最新更新