编写一个简单的问答应用(有关详细信息,请参阅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>
非常感谢你的帮助,我有书籍和谷歌,并且一直在阅读我的美元,只是在这里丢了酱。这是我第一次尝试超出预先编写的示例代码的安全性,所以请温柔!!
谢谢!
答案 0 :(得分:1)
在大多数情况下,在Q& A应用中,您将拥有问题模型,答案模型和用户模型。你的行动是:
一些代码:
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)
基本流程应为:
现在到模特。你可以在那里放置检查某些东西的方法。仍然,控制器处理工作,它调用方法并在控制器中处理结果。