0

たとえば、次のようなQuestionモデルがありますhas_many :answers

questions#show(stackoverflowと同じように)に新しい回答のフォームを表示したい

ルートは次のようになります。

resources :questions do
  resources :answers
end

このような状況で無効なレコードのエラーを表示するための最良の方法は何ですか?

問題は、(そうなるので)render内部から必要なアクションを実行できないことです。唯一の方法は、エラーをハッシュに格納することであるように思われます。AnswersControllerquestions#showredirect_toflash

それはかなり一般的なシナリオのように見えます、私はいくつかのより良い方法があるはずだと信じています

4

3 に答える 3

2

QuestionsControllerこれは、新しいリソースの豊富なメンバールートを:に追加することが実際に正当化される数少ないケースの1つである可能性があります。

resources :questions do
  post 'answer', :on => :member
end

question/:id/answerこれは、にルーティングされたPOSTリクエストで認識し、questions#answerすべてのロジックを1つのコントローラーに保持できるようにします。

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

説明:私の意見では、2つではなく1つのコントローラーでロジックを処理するという決定は、関心のあるリソースであるとみなすものに帰着します。通常、各モデルは個別のリソースを表すと見なし、各リソースに関連するアクションを処理するための個別のコントローラーを作成します。showただし、複数のアクション( 、、newなど)が単一のビューで処理される複数の深く結合されたモデルがある場合、モデルを単一のリソースcreateを形成していると考える方がクリーンな場合があります。

この例では、リソースを質問とその回答の両方で構成される集合的なリソースと考えています。この集合的なリソースは質問自体によって一意に識別されるため、質問コントローラーに処理させます。show質問コントローラーのアクションには、集合的な質問と回答のリソースの取得がすでに含まれているため、answerアクション(および場合によってはアクション)unanswerをその集合的なリソースreanswerの類似物と考えることができます。update

このようにリソースを考えることは、主に設計の好みの問題であり、要件に応じてトレードオフがあります。

于 2012-10-14T06:02:08.440 に答える
1

questions#show次のAnswersControllerようにレンダリングできます。

render :template => 'questions/show'

ページ上の特定のアンカーにジャンプする場合は、回答フォームでそれを定義する必要があります。

<%= form_for(@answer, :url => question_answers_url(@question, :anchor => 'answer_form')) do |f| -%>
于 2012-10-13T15:54:38.303 に答える
-1

Answers_controller#createアクションにデータを投稿する形式のパーシャルを用意します。

したがって、questions#showページ-show.html.erbで、部分的にレンダリングします

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

_answer_form.html.erbに、answers#createにデータを投稿するフォームを作成します

<% form_for @answer do |f| %>
  # have a text area
<% end %>

フラッシュに関する限り

AsnwersControllerで

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
于 2012-10-14T06:35:54.813 に答える