コードで恐ろしいパターンを使用していますが、これを行うにはもっと良い方法があるはずです。自分のしていることを再考するのを手伝ってください。
私のウェブサイトは一種のディスカッション フォーラムです。ディスカッションへのすべての返信は、インラインの DiscussionsController#show ページで行われます。
ただし、一部の返信は無効です。たとえば、テキストが含まれていない返信を投稿しようとすると、エラー メッセージが表示されて DiscussionsController#show に戻ります。
このワークフローをどのように実装したかを簡単に説明します。
- ユーザーは DiscussionsController#show に移動します。このテンプレートには返信フォームがあります。明示的な RepliesController#new アクションはありません。
- ユーザーは返信フォームを送信します。これは、replies_path に POST され、RepliesController#create で処理されます。
- RepliesController#create は無効であるため、返信を保存できません (返信の Validates_length_of はオブジェクトを無効にします)。
- RepliesController#create は、返信オブジェクトを session[:new_reply] に置き、ユーザーが来たディスカッションパスにリダイレクトします。
- DiscussionsController#show は、セッション オブジェクトを処理します...
そのようです:
if session[:new_reply]
@new_reply = session[:new_reply]
session.delete(:new_reply)
end
そして今、show.html.erb には、エラーを検査するために新しく再生成された @new_reply オブジェクトがあります。
これには明らかに何か問題があります。オブジェクト全体をセッション内に格納するべきではありません。しかし、RepliesController#create で保存しようとした Reply オブジェクトは保存されないため、コントローラーのアクション呼び出し間でそれを保持するにはどうすればよいでしょうか?
または、より大きな設計ソリューションがある場合は、自由に共有してください。これはとても醜いので、私を傷つけています。ありがとう。