Rails MVC概念的麻烦

时间:2011-04-06 19:39:18

标签: ruby-on-rails model-view-controller ruby-on-rails-3 design-patterns

呃 - 不知道为什么我这么麻烦。

编写一个简单的问答应用(有关详细信息,请参阅Rails - Where should this code go to stay true to MVC design?

努力坚持MVC原则和正确的设计 - 这个应用程序只是一种学习体验,所以我想确保我以一种普遍接受的方式做事

引用的问题给了我建议将我的功能分解为不同的模型。然而,试图实现这一点,我发现自己在各地传递参数,我只是觉得我没有做正确的事情。所以,这里是应用程序的基本布局和我想要完成的任务 - 如果有人能让我知道我是否在正确的轨道上......

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

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

我使用scaffold创建了上述两个,因此它们具有所有默认路由,控制器操作等...

我创建了一个网关控制器,并通过routes.rb

将其设置为我的默认页面

想法是,用户浏览localhost:3000 /?uid =“whatever”,索引页面显示当前问题(Question.find_by_question_number(@ user.current_question))

用户在表单中输入答案,并将其发布到操作中。在我的初稿中,这称为网关控制器中的一个操作,它检查答案是否正确。

现在,我正在尝试在我的上一个问题中接受vadim的建议,并让用户登录用户和问题逻辑。所以现在我的表单POST到用户控制器。

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

明白我的意思?我绝对理解MVC在理论上的价值,但每当我尝试实现它时,我都会遇到像这样的混乱。这是正确的,它似乎过于复杂,因为我的程序很简单?

有人可以告诉我你如何拆分逻辑吗?您不需要发布实际代码,只需要将其放在哪里,例如:

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

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

基本流程应该是,用户显示问题,用户回答问题,答案与问题模型中的正确答案进行比较,根据结果返回消息,答案是否正确,用户的current_question递增。 / p>

非常感谢你的帮助,我有书籍和谷歌,并且一直在阅读我的美元,只是在这里丢了酱。这是我第一次尝试超出预先编写的示例代码的安全性,所以请温柔!!

谢谢!

2 个答案:

答案 0 :(得分:1)

在大多数情况下,在Q& A应用中,您将拥有问题模型,答案模型和用户模型。你的行动是:

  1. 显示答案(问题控制器的show方法)
  2. 显示新的答案表格
  3. 在Answers控制器上发布到create方法。
  4. 一些代码:

    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
    

答案 1 :(得分:0)

基本流程应为:

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

现在到模特。你可以在那里放置检查某些东西的方法。仍然,控制器处理工作,它调用方法并在控制器中处理结果。