1

これは非常に単純な質問だと思いますが、私が読んだものは私の質問に直接答えていません:

標準フォームの新しい製品ページがあります。フォームの送信に成功したら、「thanks」という名前のカスタム コントローラー アクションとビューにリダイレクトします。

「ありがとう」ページで、作成したばかりの製品の名前と、場合によっては他の属性を印刷できるようにしたいと考えています。

作成したばかりのオブジェクトを新しいアクションに渡すにはどうすればよいですか? 現在、コントローラーは次のようになっています。

def create
    @product = Product.new(params[:product])
    if @product.save
    flash[:notice] = "Successfully created Product."
    redirect_to thanks_path
    else
    render :action => 'new'
    end
end

def thanks
end
4

2 に答える 2

2

かなり適切なオプションが 2 つあります。

まず、thanks_path ルートを調整して id パラメーターを受け取り、 のように呼び出すことができますredirect_to thanks_path(@product)。次に、標準の show メソッドと同様に、Thank you メソッドで呼び出すことができます。お礼の画面に機密情報を表示する場合は、id の代わりにランダムな uuid を使用して製品を検索することをお勧めします。

より良い方法は、まったくリダイレ​​クトしないことですが、単にフォームを描画するだけでなく、ビューを次のように調整することです。

<% if @product && !@product.new_record %>
  THANK YOU MESSAGE GOES HERE
<% else %>
  EXISTING FORM GOES HERE
<% end %>
于 2013-05-14T04:28:56.363 に答える
2

リダイレクトを介してオブジェクトを送信することはできません。

問題を解決するには、次の 3 つの方法があります。

  1. 「thanks」テンプレートを直接レンダリングします (アクション #thanks ではありません)。

    render 'thanks' # thanks template
    

    このテンプレートに任意のインスタンス変数を直接送信できます。#thanksこの場合はもう必要ありません。

    欠点: URL は変更されません。

  2. セッションを通じてメッセージを伝える

    特定のメッセージを表示したい場合は、それを準備してまたは(実際にはセッションの一部)を#create介して送信できます。手動でクリアする必要がないため、より優れています。sessionflashflash

    注: メッセージ サイズが大きい場合は、ActiveRecord をセッション ストレージとして使用することをお勧めします。そうでない場合は、デフォルト設定で CookiesOverflow を満たすことになります。

  3. obj_id などのセッションを介して非常に単純なメッセージを送信します

    #2 に似ていますが、これは #2 よりも優れていると思います。では#thanks、obj_id が存在するかどうか、id は何かに従って複雑なメッセージを作成し、db を介して関連データを見つけることができます。

于 2013-05-14T04:30:37.233 に答える