0

LessonsControllerにはnewcreateメソッドがあります。

def new
  @lesson = Lesson.new
end

def create
  @lesson = Lesson.new(params[:lesson])
  if @lesson.save do something end
end

私は自分のアプリでこれを何も考えずにやっています。それは機能しますが、newアクションとcreateアクションの両方でインスタンス変数を作成している理由がわかりません。私が理解していることから、これはフローです:

ユーザーがnew lessonボタンをクリックすると、に移動しLessonsController#newます。彼が必要な値を入力してクリックsubmitすると、に移動しますLessonsController#createcreateメソッドのビューテンプレートは必要ありません。

だから私の混乱は、なぜあなた@lessonはメソッドで再びオブジェクトを作成するのcreateですか?この質問への答えにはGETPOSTHTTPメソッドに関するいくつかの概念も含まれている必要があると思います。

助けてくれてありがとう!ありがとうございました。

4

2 に答える 2

5

これは、HTTP がセッションレス プロトコルであり、インスタンス変数が複数のリクエスト間で引き継がれないためです。

ページをロードするリクエスト#newは単一のリクエストであり、フォームを送信してcreateボタン (または他の対応するもの) を押すと、ブラウザは#createメソッドへの新しいリクエストを開始します。

メソッドで初めて-デフォルト値で#newインスタンス変数を作成しています:@lesson

@lesson = Lesson.new

ただし、#createメソッドで 2 回目 - 新しいリクエストは、非常に異なるインスタンス変数の作成を強制しています。

@lessong = Lesson.new(params[:lesson])

POSTこの ^ 2 回目は、フォームの送信 (通常は を使用したリクエスト)から受け取った値でインスタンス変数を開始しています#create。なぜこのようになっているのか、空気がきれいになることを願っています。

于 2013-01-27T01:27:03.537 に答える
2

newアクションは、作成フォームをレンダリングするために使用されますLesson。フォームを構築するために、そのアクションでインスタンスを作成しています。Rails フォーム ヘルパーは、アクションで empty Lessoncreated を使用しnewて、フォーム フィールド名、送信 URL などを構築します。これとは別に、フォームは、DB 移行スクリプトまたはafter_initializeモデルのコールバックで宣言されたデフォルト値にアクセスできます。アクションで作成されたLessonインスタンスnewは保存されません

ユーザーがフォームを送信すると、createアクションが呼び出されます。このアクションでは、 の新しいインスタンスをインスタンス化してLesson保存することになっています。

于 2013-01-27T01:27:37.833 に答える