使用面向资源的控制器时,在Rails中呈现不同的控制器操作

时间:2010-10-26 22:29:35

标签: ruby-on-rails rest resources controller rendering

说我正在制作像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以实际创建对象,这似乎在单个控制器中运行良好。

如何跨控制器完成?

1 个答案:

答案 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

某些细节需要添加(例如,在完成后从会话中清除)等等