2

コードで恐ろしいパターンを使用していますが、これを行うにはもっと良い方法があるはずです。自分のしていることを再考するのを手伝ってください。

私のウェブサイトは一種のディスカッション フォーラムです。ディスカッションへのすべての返信は、インラインの DiscussionsController#show ページで行われます。

ただし、一部の返信は無効です。たとえば、テキストが含まれていない返信を投稿しようとすると、エラー メッセージが表示されて DiscussionsController#show に戻ります。

このワークフローをどのように実装したかを簡単に説明します。

  1. ユーザーは DiscussionsController#show に移動します。このテンプレートには返信フォームがあります。明示的な RepliesController#new アクションはありません。
  2. ユーザーは返信フォームを送信します。これは、replies_path に POST され、RepliesController#create で処理されます。
  3. RepliesController#create は無効であるため、返信を保存できません (返信の Validates_length_of はオブジェクトを無効にします)。
  4. RepliesController#create は、返信オブジェクトを session[:new_reply] に置き、ユーザーが来たディスカッションパスにリダイレクトします。
  5. DiscussionsController#show は、セッション オブジェクトを処理します...

そのようです:

if session[:new_reply]
  @new_reply = session[:new_reply]
  session.delete(:new_reply)
end

そして今、show.html.erb には、エラーを検査するために新しく再生成された @new_reply オブジェクトがあります。

これには明らかに何か問題があります。オブジェクト全体をセッション内に格納するべきではありません。しかし、RepliesController#create で保存しようとした Reply オブジェクトは保存されないため、コントローラーのアクション呼び出し間でそれを保持するにはどうすればよいでしょうか?

または、より大きな設計ソリューションがある場合は、自由に共有してください。これはとても醜いので、私を傷つけています。ありがとう。

4

3 に答える 3

2

リダイレクトする代わりに、代わりに実行してくださいrender :action => "discussions/show"。変数も設定する必要があると言いましたが@discussion、返信はディスカッション内のネストされたリソースであるため、これを行う必要があります。

于 2009-05-09T10:31:07.587 に答える
2

セッションの代わりに、応答を フラッシュに保存します。これは、アクション間でメッセージ/オブジェクトを渡すのに適しています。

コントローラーは、応答が有効でない場合はフラッシュに応答を保存してリダイレクトします。

if @reply.save
   ...
else
   flash[:reply] = @reply
end

また、ディスカッション/ショーページのフォームロジックは少し賢く、フラッシュまたは新しいもの(ディスカッション/ショーアクションで作成していると思います)で返信を取得する必要があります。

form_for(flash[:reply] || @reply) do
  ...
end
于 2009-05-09T23:13:25.927 に答える
0

I would say that the way you're doing it is reasonable. Not the cleanest but it is RESTful.

Radar's suggestion is great but in the current version of Rails, using render :action => "discussions/show" doesn't create the correct behavior, at least in my attempts, which have been without nested resources routing. Using render :controller => "discussions", :action => "show" yields another behavior that isn't what the poster is looking for.

于 2009-09-18T17:19:59.073 に答える