6

Rails 2.3.1 Web サイトを開発しています。Web サイト全体で、さまざまなページ (ホームページ、投稿の作成ページ、投稿一覧ページ、コメント一覧ページなど) に投稿を作成するためのフォームが必要です。さまざまなコントローラー)。これらの各ページには、対応するコントローラー/アクションで取得されるさまざまなその他の情報が表示されます。例: ホームページには、最新の 10 件の投稿、DB から取得されたコンテンツなどが一覧表示されます。

そこで、投稿作成フォームを独自の部分に移動し、必要なすべてのページにこの部分を含めました。Partial POST のフォームが /questions に送信されることに注意してください (これは PostsController::create にルーティングされます。これはデフォルトの Rails の動作です)。

私が直面している問題は、フォームがホームページ (/home/index. html.erb)。

@post.save? == false, I render action => "../submitting_controller/submitting_action" (少しハックですが、PostsController 以外からアクションをレンダリングできます)。

これは表面上はうまくいくように見えました。不完全なフォームは、すべて正しい @post.errors メッセージなどで送信されたビューでレンダリングされました。問題は、実際の submit_controller/submitting_action メソッドが呼び出されなかったため、ページ上の他のすべてのデータが表示されなかったことです。関連付けられたビュー。(すべてのエラー メッセージと送信された値を持つ @post インスタンス オブジェクトを保持しない redirect_to ではなく、インスタンス オブジェクトを保持する render を実行したことを思い出してください。)

私が見る限り、2つのオプションがあります:

1) @post.save 時に @post オブジェクトをセッションに保存できますか? PostsController::create、redirect_to submit_controller/submitting_action で失敗し、その時点で @post オブジェクトをセッションから取り出し、それを使用してフォーム/エラー メッセージを再設定します。(私が理解している限り、セッションにオブジェクトを保存することは、レールでは悪い習慣です)

2) さまざまな submit_controller/submitting_action から非投稿作成フォーム データをプルするために使用されるすべてのロジックを移動し、それを ApplicationController に配置し、PostsController::create で submit_controller/submitting_action の巨大な switch ステートメントを作成し、メソッドをApplicationController を使用して、各送信ページのレンダリングに必要なすべての追加データを取得します。

Rails内でこれを行う最善の方法について考えていますか?

4

2 に答える 2

1

これは、ページ全体の更新から、AJAX を使用したページのセクションの更新に移行するポイントについてです。考慮すべき点はたくさんありますが、最も Rails 風のアプローチは、応答を AJAX 応答とプレーンな HTML 応答に分割することです。この ONLamp の記事この登録の記事、またはRails ブックを使用した素晴らしいアジャイル Web 開発 を確認してください。基本的に、コントローラーは、パーシャルの送信結果を含む古い div を置き換える新しい div をレンダリングします。

あなたの質問では、2つのアプローチについて言及しているので、ここで理由と理由についていくつかの指針を示してみます。

オプション 1) このオプションは、いくつかの微調整を行うだけでそれほど悪くはありません。主な調整は、オブジェクトをシリアル化された形式で DB に格納することです。次に、シリアル化されたオブジェクトの ID を渡すだけです。あなたの利点は、セッションデータが永続化されるため、セッションの回復がより簡単になり、セッションが軽いままになることです。これの欠点は、DB にセッション クラフトのバケツがあるとアプリが汚染され、DB から未使用のセッション クラフトを期限切れにする方法について考える必要があることです。この結末をよく見たことがない…

オプション 2) application_controller の内部ではありません。:) 真剣に、それを最後の手段として保管してください。ただし、ヘルパー内のものをポップして、コントローラーとビュー内のこれらのメソッドにアクセスできます。ただし、そのようなもののテストはそれほど簡単ではないため、そのルートを選択する前に注意してください. Switch ステートメントは、ちょっとした工夫で OO アプリに置き換えることができます。確かに彼のケースでは、オプション ハッシュを使用して、リクエストが行われた時点でのアプリの状態を賢く把握する方法を手に入れることができます。

于 2009-10-12T02:37:25.397 に答える
1

あなたの Post モデルは、フォームをレンダリングするために使用するコントローラーである各モデルとの belongs_to 関係にありますか? Post コントローラーで特別な処理を行っていますPost.create(params[:post])か?

最初の質問に「はい」と答え、2 番目の質問に「いいえ」と答えた場合、ユーザーが投稿を作成できる各コントローラーに accept_nested_attributes_for を追加することで、最小限のマングリングでやり遂げることができます。

いずれにせよ、Robertpostill の言うことは、ページのセクションを単に置き換えるために AJAX を検討し始める時期であるという点で正しいです。唯一の問題は、ユーザーが JavaScript を無効にしている場合の対処方法です。個人的には、JavaScript 以外のケースの設計を行い、便利なメソッドを追加するのが好きです。

2つのオプションをどう考えるかについての考えについては、

1) このメソッドを使用して、オブジェクトの浅いコピーをフラッシュ ハッシュに格納しました。リダイレクト間でそれを保持します。ただし、投稿の可変性を考慮すると、これはうまくいかない場合があります。約 4K 相当のデータしか送信できないため、浅いコピーに加えて他の情報も含まれます。

2) Robertpostill の応答を参照してください

于 2009-10-12T03:02:37.150 に答える