8

Rails 3 には一種のフォーム ウィザードがあります。基本的に、ホテル オブジェクトを作成し、それがすべて完了したら、そのホテルのロケーション オブジェクトを作成します。ホテルを作成するためのコントローラー コードは次のようになります。

  def create
    @hotel = Hotel.new(params[:hotel])

    respond_to do |format|
      if @hotel.save
        @location = Location.new
        format.html { redirect_to '/set_location'}
      else
        format.html { render action: "new" }
      end
    end
  end

次に、「/set_location」ページに、場所を設定するフォームがあります。ただし、'undefined method model_name for NilClass:Class'@location インスタンス変数の html.erb でエラーが発生します。

これは、redirect_to の代わりに render '/set_location' を使用すると正常に動作するため、非常に奇妙です。ただし、レコードの重複送信を防ぐために、redirect_to メソッドを使用したいと考えています。

これについて何か助けてくれてありがとう。

4

3 に答える 3

15

HTTP は設計上ステートレスです。リクエスト間で状態を共有したい (リダイレクトが別のリクエストにつながる) 場合は、sessionハッシュを使用する必要があります。このような:

session[:hotel_id] = @hotel.id

そして、次の方法Hotelで取得します。/set_location

Hotel.find(session[:hotel_id])
于 2012-04-11T11:13:02.457 に答える
1

あなたがやりたいことは次のとおりだと思います:

  1. 「/set_location」リクエストに応答するコントローラーとアクションを特定します。
  2. この行が欠落していることがわかります@location = Location.new。そこで作成する必要があります。

Rails のインスタンス変数は、コントローラーとビューの間で情報を渡すためによく使用されます。そのため、 renderを実行してもエラーは発生しません。Rails ビューは、コントローラーからのインスタンス変数を認識します。

ただし、リダイレクトを行っているため、何@locationがわからない別のコントローラーを呼び出しています。

于 2012-04-11T11:21:32.840 に答える