0

Myページnewとページは、 andアクションで使用されていないインスタンス変数editに依存します。@important_datacreateupdate

その結果、私のページはnew失敗時にページをレンダリングできません。

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    render action: "new"
    #this can't render because the page asks for an @important_data variable that's not defined.
  end
end 

以下の 2 つのソリューションのどちらを選択する必要がありますか? それぞれの長所/短所は何ですか?

オプション 1: レンダリング前に @important_data を宣言する

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    @important_data = ImportantData.all
    render action: "new"
  end
end 

オプション 2: リダイレクト

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    redirect_to new_my_object_path
  end
end 
4

3 に答える 3

1

を使用する場合は、から更新された属性でrender使用しています。ほとんどの場合、これはあなたが望むものです。ユーザーにページを表示するときは、ユーザーがフォームに加えた変更を保持し、エラーを表示する必要があります。@my_objectparams[:my_object]

を使用する場合redirectは、別の追加のリクエストを行っているため、フォームから送信されたパラメーターは保持されません (リダイレクトの呼び出しでパラメーターを渡してコントローラー アクションでビルドしない限り)。

@important_dataしたがって、ほとんどの場合、検証が失敗したときに宣言する必要があります。リダイレクトしたい場合は考えられません。

于 2013-09-01T04:19:14.753 に答える
1

OPTION1を使うべきだと思います

したがって、redirect_to を使用する必要があるのは、HTTP POST リクエストを実行していて、完了時にユーザーにリクエストを再送信してほしくない場合です (アイテムの重複やその他の問題が発生する可能性があります)。

Rails では、モデルの保存に失敗した場合、render を使用して、以前に入力したものと同じエントリでフォームを再表示します。リダイレクトを使用する場合は、パラメーターまたはセッションを使用してフォーム エントリを渡す必要があるため、これは簡単です。副作用は、ブラウザを更新すると、以前のフォーム エントリを再送信しようとすることです。これはおそらく同じように失敗するため、または現在成功している場合でも、ユーザーが最初に期待するものであるため、許容されます。

上記の回答は以下から参照されています: Are redirect_to and render exchangeable?

于 2013-09-01T04:26:16.097 に答える
1

もちろん、エラーの場合にのみ新しいレンダリングを行うため、Option1 が最適に機能します。また、リダイレクトはユーザーエクスペリエンスを少し台無しにします。同じクエリ @important_data = .... を再度実行してページを再度レンダリングするには少し時間がかかります。

于 2013-09-01T04:15:36.677 に答える