Ruby on rails Rails MVC概念的问题

Ruby on rails Rails MVC概念的问题,ruby-on-rails,model-view-controller,ruby-on-rails-3,design-patterns,Ruby On Rails,Model View Controller,Ruby On Rails 3,Design Patterns,呃-不知道为什么我会有这么多麻烦 编写一个简单的问答应用程序(有关详细信息,请参阅) 努力坚持MVC原则和正确的设计——这个应用程序只是一种学习体验,所以我想确保我以一种普遍接受的方式做事 参考问题给了我建议,将我的功能划分为不同的模型。然而,为了实现这一点,我发现自己到处都在传递参数,我只是觉得自己做得不对。所以,这里是应用程序的基本布局和我正在尝试完成的任务-如果有人能让我知道我是否在正确的轨道上 问题模型:包含id(pkey)、问题编号(int)、问题文本(字符串)、答案文本(字符串) 用

呃-不知道为什么我会有这么多麻烦

编写一个简单的问答应用程序(有关详细信息,请参阅)

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

参考问题给了我建议,将我的功能划分为不同的模型。然而,为了实现这一点,我发现自己到处都在传递参数,我只是觉得自己做得不对。所以,这里是应用程序的基本布局和我正在尝试完成的任务-如果有人能让我知道我是否在正确的轨道上

问题模型:包含id(pkey)、问题编号(int)、问题文本(字符串)、答案文本(字符串)

用户模型:包含:id(pkey)、uid(字符串)、当前问题(int)、名称(字符串)

我用scaffold创建了上面两个,这样它们就有了所有的默认路由、控制器动作等等

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

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

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

现在,我试图在我的最后一个问题中采纳vadim的建议,并将用户登录保持在user中,并保留问题逻辑。现在我的表单发布到用户控制器

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

明白我的意思吗?我在理论上完全理解MVC的价值,但每当我尝试实现它时,我都会遇到这样的麻烦。这是正确的,因为我的程序很简单,所以看起来事情太复杂了

有人能告诉我你是如何把逻辑分解的吗?您不需要发布实际的代码,只需要将代码放在哪里,例如:

网关控制器: -向用户显示问题 -将答案交给XXX控制员

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
XXX控制器: -在XXX模型中调用方法Foo,传递X和Y

基本流程应该是,向用户显示一个问题,用户回答问题,将答案与问题模型中的正确答案进行比较,根据结果返回消息,并且答案正确,用户当前的_问题递增

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


谢谢

基本流程应为:

  • 控制器中的方法选择问题并显示一个包含表单的视图
  • 用户提交此表单
  • 这是控制器的一个帖子
  • 在控制器中,检查结果并在另一个/同一视图中向用户显示

现在来看看模型。你可以在里面放一些方法来检查某些东西。不过,控制器处理工作,调用方法并在控制器中处理结果。

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

  • 显示答案(问题控制器的显示方法)
  • 显示新的答案表单
  • 过帐到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
    
    应答器控制器

    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
    
    类应答器控制器
    这就是我最初构建它的方式……因此,我可以让网关控制器获得帖子,调用一个方法来测试答案(可能在问题模型中,将问题ID和用户答案传递给它),让返回Bool,控制器对此进行操作……例如,在用户模型中调用一个方法来增加当前的_级别,然后显示正确的视图。。。听起来对吗?我被瓦迪姆的评论搞糊涂了,他从用户方法中调用了提问方法,这对我来说完全正确。我真的不明白瓦迪姆在另一个帖子中的评论。好吧,我想这就解决了。无论如何,这在我的脑海里更有意义——谢谢你跟我说出来:)不客气!我还记得我从Rails开始的时候,它很复杂:)(如果你有兴趣关注我个人资料中的链接,你可能会发现有几篇关于Rails的文章对学习Rails很有用)Jesse-我想当我说“Q&A”的时候,你会觉得是这样的,有人问了一个问题,然后发布了多个答案。您的代码在该场景中看起来很棒-但我的程序更像是一个琐事,其中有一个包含正确答案的问题的数据库表,用户被要求提供问题X的正确答案。因此,在这种情况下,用户和问题之间没有真正的关系,没有理由把问题和答案分开……对吗?:)我仍然会像上面一样构造代码。我会考虑在问题下面有一个“可能的答案”表,这是一个可能的答案列表