【问题标题】:Rendering different controller actions in Rails when using resource-oriented controllers使用面向资源的控制器时在 Rails 中呈现不同的控制器操作
【发布时间】:2023-03-22 11:44:01
【问题描述】:

假设我正在制作一个像 StackOverflow 这样的问答网站。我有两个资源:问题和答案。我使用的是默认 Rails RESTful 资源路由,因此每个资源都有自己的控制器和创建方法。

/questions/show 视图中,我希望允许用户提交特定问题的答案。该表单将 POST 到 /answers,该表单将通过调用 create 方法作为请求路由到 AnswersController

如果创建了答案,我可以简单地重定向回原来的问题。但是,我在处理答案对象上的验证失败时遇到了麻烦。我需要渲染/question/show 视图并显示答案对象的验证错误。我不清楚如何最好地做到这一点。

以下是两个控制器的外观示例 sn-ps。

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 的 create 方法的 else 子句应该包含什么?重定向似乎是错误的,因为错误实际上是由同一个请求引起的。调用 render :template =&gt; 'questions/show' 之类的东西似乎也是错误的,因为我必须初始化模板所依赖的任何实例变量。

这种调用 GET 以查看表单以创建对象并调用 POST 以实际创建对象的单独操作的样式似乎在单个控制器中运行良好。

如何跨控制器完成?

【问题讨论】:

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


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多