1

先日、私は Sandi Metz のルールに出くわしました。

呼び出しが Rails コントローラーに着信したとき、実行する必要があることを実行するために 1 つのオブジェクトのみをインスタンス化できます。

まだ Rails を使い始めたばかりですが、コントローラーのメソッドに匂いがあるといつも思っていましたが、これでそれが確認されました。親モデルのダッシュボード ビューがあり、子 (別のモデル) と子の課題 (別のモデル) に関する情報がすべて異なるコントローラーで表示されます。これは、コントローラ メソッドの 1 つの例です。

def dash
  @parent = current_user
  @children = @parent.children
  @completed_challenges = @parent.assigned_challenges.where("parent_id =?", @parent.id).where("completed =?", true)
  @validated_challenges = @parent.assigned_challenges.where("parent_id =?", @parent.id).where("validated =?", true)
  @enabled_rewards = @parent.enabled_rewards.where("parent_id =?", @parent.id)
end

複数のリクエストを送信して、これらすべてのオブジェクトを 1 つのリクエストにまとめるのではなく、それぞれのコントローラーから取得できるかどうか疑問に思っていました。Ajax でこれを実行できることはわかっていますが、ページの読み込み中に複数の http 要求を実行する方法はありますか?

助けてくれてありがとう!

4

3 に答える 3

1

答えはノーです。

AJAX は、複数の http 要求の欠点を克服するために、その目的のために特別に構築されました。さらに、パフォーマンスの低下により、ページの読み込みが嫌われている間に複数の http リクエストが発生します。小さなプロジェクトにとっては儲かる道のように思えるかもしれませんが、規模が大きくなると、間違いなく巨大な穴に突き当たります。

私はそれの大ファンではありませんが、この場合、殴られた道をたどることで多くの労力を節約できます. :)

于 2013-04-12T22:51:37.097 に答える
0

呼び出しが Rails コントローラーに着信したとき、実行する必要があることを実行するために 1 つのオブジェクトのみをインスタンス化できます。

このルールの有用性はわかりますが、少し異なる方法で解釈できると思います。コントローラーをロードするときは、できる限り実行しないようにする必要があります。これは与えられたものです。

ただし、あなたの場合、ロードするデータのビットがたくさんあるようです。見栄えが悪いだけでなく、ダッシュボードがより多くのメトリックをサポートするにつれて、コードも大きくなる傾向があることがわかります。アプリケーションが表示するデータの量に比例してコードの行数が増加するような状況にはなりたくありません。

代わりに、1 つのオブジェクト (表示する必要があるすべてのデータの辞書) を送信します。そして、その辞書の構築を、それを構築するモデル (またはさらに良いのはサービス) に移すことをお勧めします (おそらく、何らかの構成に基づいています)。コントローラーは、そのオブジェクトをどこかから取得し、正しい形式で送り返すだけです。

于 2013-04-13T10:53:18.653 に答える