質問: params[:pass] if @svalidate.valid? render 'confirm' else render 'index' end end end ``` indexのテンプレートファイルでは、@svalidateを埋め込んでエラーメッセージを表示させています。 この実装に関して、以下2点がおかしいような気がするのですが、改善可能でしたら、ご教示お願いします。 ``` ・1点目。 indexのテンプレートで@svalidateのエラーメッセージを埋め込む為に、 バリデートクラスを2回newしている点。 可能であれば、1回のnewで済む方法があれば教えていただきたいです。 アクション間で、共通のインスタンス変数を認識する方法ってないですか? もしくは簡単にアクション間でインスタンス変数を渡せないですか? ・2点目。 バリデートに引っ掛かっているとき、renderでindexを表示している点。 URLがconfirmのもので、indexが表示されます。 confirmはルーティングでPOSTからの受付しか許可していないので、 ブラウザをリロードすると、URLがconfirmのときのindexページはエラーを起こします。 リダイレクトでindexアクションを表示すればいいのかもしれませんが、その場合、@svalidateをリダイレクト先のindexアクションに引き継がせる方法がわかりません。 ```
回答: 結論としては、このままで問題ないと思います。 ##### 1点目 indexアクションとconfirmアクションは別々のアクセスです。 なので、confirmアクションが呼ばれるときはindexアクションで作ったものをRailsは覚えていません。 2回newしているのではなく、1回のアクセスごとに1回ずつnewしているので問題ありません。 httpがステートレスなプロトコルであることを意識すると腑に落ちるかもしれません。 参考 : https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6 ##### 2点目 たしかにこれは気になりますよねw ですが、これはRails的には標準的な動作です。 試しにscaffoldで何か作ってみてください。 controllerを見れば分かりますが、newアクションでフォームを表示して、createアクションで失敗したらnewがレンダーされます。 このときのURLは、newではなくcreateのURLになっています。 scaffoldの場合はcreateのURLをgetでアクセスしたらindexになるのでエラーは起きませんが、挙動としては同じです。 もしどうしても気になるようであれば、confirmのURLをgetでアクセスしたときのアクションを別途作って、エラー画面を出す、とかになると思います。