模型视图控制器——Rails MVC概念的麻烦



哎呀-不知道为什么我有这么多麻烦。

写一个简单的问答应用程序(见Rails -这段代码应该去哪里保持真正的MVC设计?查看一些细节)

尝试坚持MVC原则和适当的设计-这个应用程序只是一个学习经验,所以我想确保我在一个普遍接受的方式做事

参考问题给了我建议,把我的功能分成不同的模型。然而,在尝试实现这一点时,我发现自己到处传递参数,我只是觉得我没有做正确的事情。所以,这是应用程序的基本布局和我要完成的任务-如果有人可以告诉我,如果我在正确的轨道上…

问题模型:包含id(pkey), question_number(int), question_text(string), answer_text(string)

用户模型:包含:id(pkey), uid(string), current_question(int), name(string)

我用脚手架创建了上面两个,所以它们有所有的默认路由,控制器动作等…

我创建了一个网关控制器,并通过routes.rb将其设置为默认页面

这个想法是,用户浏览到localhost:3000/?uid="whatever",索引页显示当前问题(question .find_by_question_number(@user.current_question))

用户在表单中输入答案,表单将其发送给操作。在我的初稿中,这调用了网关控制器中的一个操作来检查答案是否正确。

现在,我正在尝试在我的最后一个问题中采纳vadim的建议,并保留用户登录用户和问题逻辑。现在我的表单发送到用户控制器。

这就是我搞混的地方。逻辑代码不应该在控制器中,对吧?我在模型中调用一个方法,传递用户的答案和问题id因为我无法读取模型中的会话。这工作得很好,我现在可以处理用户模型中的逻辑——现在用户模型调用问题模型中的方法来实际检查答案。这意味着我必须使用我传递的ID实例化我的问题对象,然后调用另一个方法,传递(再次!)答案。等等…等等…

明白我的意思吗?我绝对理解MVC的价值在理论上,但每当我试图实现它,我结束了这样的混乱。这是对的吗,因为我的程序很简单,所以看起来有点过于复杂了?

谁能告诉我你是怎么分解逻辑的?你不需要发布实际的代码,只需要你放在哪里,像:

网关控制器:-向用户显示问题-获取答案并传递给XXX控制器

XXX控制器:在XXX模型中调用方法Foo,传递X和Y

基本流程应该是,向用户显示一个问题,用户回答问题,将答案与问题模型中的正确答案进行比较,根据结果返回消息,如果答案正确,则增加用户的current_question。

非常感谢你的帮助,我有书和谷歌,我一直在阅读我的$$ $ off,只是迷失在酱汁这里。这是我第一次尝试在预先编写的示例代码的安全之外冒险,所以请温柔!!

谢谢! !

在大多数情况下,在问答应用程序中,您将有一个问题模型,一个答案模型和一个用户模型。你的动作是:

  1. 显示答案(Questions控制器的show方法)
  2. 显示新的回答表单
  3. 发送到Answers控制器上的create方法。
一些代码:

class Question
  has_many :answers
end
class Answer
  belongs_to :question
  has_many :users
  validates_presence_of :user
  validates_presence_of :question
  validates_uniqueness_of :question_id, :scope => :user_id
end
class User
  has_many :answers
end

路线

resources :questions do
  resources :answers
end

answers_controller

class AnswersController < ApplicationController
  def create
    @answer = Answer.new(params[:answer])
    @answer.user = current_user
    @answer.question = Question.find(params[:question_id])
    if @answer.save
      flash[:success] = "Saved!"
      redirect_top @answer.question
    else
      render :new
    end
  end
end

基本流程应该是:

  • 控制器中的方法选择问题并显示一个带有表单的视图
  • 用户提交此表单
  • 这是一个POST到控制器
  • 在控制器中检查结果并在另一个/相同视图中显示给用户。

现在进入模型。你可以在里面放一些方法来检查某些事情。尽管如此,控制器仍然处理工作,它调用方法并在控制器中处理结果。

相关内容

  • 没有找到相关文章

最新更新