-1

モデル プロジェクトとモデル テストがあります。プロジェクトには多くのテストがあります。

tests_controllerは持っています:

def new
    @project = Project.find(params[:project_id])
    @test = @project.tests.new
end

def create
    @project = Project.find(params[:project_id])
    @test = @project.tests.create(test_params)
end

したがって、私のnew.html.erbでは、 を呼び出すフォームを提示し、new送信が押されるとcreateが呼び出されます。ただし、明らかに起こっているのは、 で 1 つのテストを作成しnew、 でまったく異なるテストを作成しているため、混乱していcreateます。私が達成しようとしていることの正しいパラダイムは何ですか?

新しいテストを作成する理由はnew、作成フォームに作成するテスト オブジェクトの ID を知らせたいからです。

4

2 に答える 2

0

#newRailsがコントローラーアクションでオブジェクトを永続化しないのはなぜですか?

  1. HTTP リクエストの一貫性

    すべての#newアクションは GET リクエストにマップされますが、リソースの作成には使用しないでください。リソースの作成は 2 つの方法で行うことができます#create。whichを使用し#updateて、PUT (または場合によっては PATCH) にマップするべき等の方法。後者は、ID が既にわかっているリソースを作成する場合に使用する方法です。

  2. 検証

    検証の背後にある全体的な考え方は、データを永続化する前に検証を適用する必要があるということです。そのため、#newアクションでは通常、モデル クラスのインスタンス化に限定し、#createアクションでは少なくとも 2 つの可能な応答を得ることができます。検証がクリアされ、オブジェクトが永続化された場合は成功し、失敗した場合は失敗します。オブジェクトの永続化でエラーが発生しました。

  3. データベースに空のオブジェクトがないようにする

    #newとが別個のアクションであるもう 1 つの理由#createは、サーバーがそれらの間でクライアントへの接続を失う可能性があることです。その場合、2 番目のアクションが実行されないため、データベースに空のオブジェクトが存在することは望ましくありません。

とはいえ、ユーザー入力を求める前にオブジェクトを永続化する強い理由があり、検証の必要がなく、データベースに空のオブジェクトがあってもかまわない場合は、#newアクションを完全にスキップすることでそれを行うことができます。これ:

def create
  @project = Project.find(params[:project_id])
  @test = @project.tests.create
end

def update
  @project = Project.find(params[:project_id])
  @test = @project.tests.update(test_params)
end
于 2013-09-08T15:00:56.503 に答える