Ruby on rails rails使用关联的记录响应U

Ruby on rails rails使用关联的记录响应U,ruby-on-rails,ruby,ruby-on-rails-3,grails-controller,respond-with,Ruby On Rails,Ruby,Ruby On Rails 3,Grails Controller,Respond With,例如,有一个问题模型,有很多答案 我想在问题#show上显示新答案的表格(就像stackoverflow一样) 路线大致如下: resources :questions do resources :answers end 在这些情况下,显示无效记录错误的最佳方式是什么 问题是,我无法从应答器控制器中呈现我需要的操作(因为这将是问题#显示),唯一的方法似乎是重定向到并将错误存储在闪存散列中 这看起来就像是一个非常常见的场景,我相信应该有更好的方法,你可以从应答器控件中呈现问题#show,如下

例如,有一个
问题
模型,
有很多答案

我想在
问题#show
上显示新答案的表格(就像stackoverflow一样)

路线大致如下:

resources :questions do
  resources :answers
end
在这些情况下,显示无效记录错误的最佳方式是什么

问题是,我无法
应答器控制器
中呈现我需要的操作(因为这将是
问题#显示
),唯一的方法似乎是
重定向到
并将错误存储在
闪存
散列中


这看起来就像是一个非常常见的场景,我相信应该有更好的方法,你可以从
应答器控件中呈现
问题#show
,如下所示:

render :template => 'questions/show'
如果要跳转到页面上的特定定位点,必须在回答表单中定义该定位点:

<%= form_for(@answer, :url => question_answers_url(@question, :anchor => 'answer_form')) do |f| -%>
question\u answers\u url(@question,:anchor=>'answer\u form'))do | f |-%

这可能是为数不多的情况之一,在这些情况下,实际上有理由向您的
问题控制员添加一个新的资源丰富的成员路线:

resources :questions do
  post 'answer', :on => :member
end
它可以识别
question/:id/answer
,并将POST请求路由到
questions#answer
,允许您将所有逻辑保存在一个控制器中:

class QuestionsController < ApplicationController
  ...
  def show
    @question = Question.find(params[:id])
  end

  def answer
    @question = Question.find(params[:id])

    @answer = @question.answers.build(params[:question][:answer])

    if @answer.save
      # show question with newly posted answer at url /question/:id
      redirect_to @question
    else
      # show question with invalid editable answer at url /question/:id/answer
      render 'show'
    end
  end
  ...
end
类问题控制器
解释:在我看来,处理一个控制器中的逻辑而不是两个逻辑的决定归结为你认为是感兴趣的资源。通常,您将考虑每个模型来表示一个不同的资源,从而创建一个单独的控制器来处理与每个资源相关的操作。但是,当存在多个深度耦合的模型,且在单个视图中处理多个操作(例如,
显示
新建
创建
)时,将这些模型视为形成单个资源可能更为清晰

在这个例子中,我认为资源是由问题和答案组成的集体资源。因为这个集合资源是由问题本身唯一标识的,所以我会让问题控制器来处理它。问题控制器中的
显示
操作已经涉及检索集体问题答案资源,因此您可能会认为
回答
操作(以及潜在的
未回答者
重新回答者
操作)类似于对该集体资源的
更新


以这种方式考虑资源在很大程度上取决于设计偏好,并根据需求进行权衡。

有一个部分,其形式为将数据发布到答案(u controller#create action)

因此,在您的问题#show page-show.html.erb中,呈现一个部分

<%= render :partial => "answers/answer_form" %>

还不能颁奖,还剩30分钟我不同意。答案的创建属于
应答器控制器#create
。你为什么认为这是合理的?这并不是说如果出现错误就不可能呈现特定的模板。@Misha请参见我上面的解释。我同意
cdesrosiers
所说的,因为这对我来说也很自然,我甚至在发布这篇文章之前,为我的
问题
模型定义了一个
答案。当然,这仍然只是个人喜好的问题。我喜欢这种方法的另一点是,它允许您简单地使用
response_with@question
感谢您的详细解释。我现在明白你的意思了。就像“更新问题”一样,你可以“回答问题”。答案是一个动词,而不是名词。使用flash来处理错误是个坏主意,而且你不能用这个解决方案重新填充字段。如果发生错误,是否希望用户重新填写整个表单?
<% form_for @answer do |f| %>
  # have a text area
<% end %>
def create
  @question = Question.find(params[:question_id])
  @answer = Answer.build(params)
  if @answer.save
    flash[:notice] = "Answer was posted successfully"  
  else
    flash[:error] = "There were a few errors please try again"  
  end
  redirect_to question_path(@question) 
end