说我正在制作像StackOverflow这样的Q& A网站。我有两个资源:问题和答案。我正在使用默认的Rails RESTful资源路由,因此每个资源都有自己的控制器和创建它的方法。
在/questions/show
视图中,我希望允许用户提交特定问题的答案。该表单将发布到/answers
,该AnswersController
将通过调用create
方法作为请求路由到/question/show
。
如果答案已创建,我可以简单地重定向回原始问题。但是,我在处理答案对象上的验证失败时遇到了麻烦。我需要呈现class AnswersController < ApplicationController
def create
@answer = Answer.new(params[:answer])
if @answer.save
redirect_to @answer.question
else
# What should go here??
end
end
end
class QuestionsController < ApplicationController
def show
@question = Question.find(params[:id])
@answer = Answer.new(:question_id => @question.id)
end
end
视图并显示答案对象的验证错误。我不清楚如何最好地做到这一点。
以下是两个控制器可能的示例摘要。
AnswersController
render :template => 'questions/show'
的创建方法的else子句应该包含哪些内容?重定向似乎是错误的,因为错误实际上是由同一请求引起的。调用像{{1}}这样的东西似乎也是错的,因为我必须初始化模板所依赖的任何实例变量。
这种具有单独操作的样式用于调用GET以查看用于创建对象的表单并调用POST以实际创建对象,这似乎在单个控制器中运行良好。
如何跨控制器完成?
答案 0 :(得分:1)
尝试使用此尺寸。它重定向,但传回了充满错误的狡猾的答案对象。
class AnswersController < ApplicationController
def create
@answer = Answer.new(params[:answer])
# stash the dodgy answer if it failed to save
session[:answer] = @answer unless @answer.save
redirect_to @answer.question
end
end
class QuestionsController < ApplicationController
def show
@question = Question.find(params[:id])
# if we have one stashed in the session - grab it from there
# because it probably contains errors
@answer = session[:answer] || Answer.new(:question_id => @question.id)
end
end
某些细节需要添加(例如,在完成后从会话中清除)等等