1

私の Rails アプリには、次のFooモデルがありhas_many Barます。のコントローラーのビューBar内でを編集したい。また、編集するたびにページ全体をリロードしたくありません。showFooBar

これを行うために、私は AJAX を使用しています。Barコントローラーには と の 2 つのビューがありshowますeditbar#showには編集ボタンがあり、両方のビューは、ページ全体をリロードする代わりに、AJAX を使用して HTTP 要求を実行し、ビュー内の特定のオブジェクトBarを表す HTML タグのコンテンツを置き換えます。BarFooshow

をレンダリングするとき、オブジェクトfoo#showごとに HTTP リクエストを実行したくありません。Barまた、Barのコントローラー メソッドは、データベースからレコードをフェッチする必要があります。これは、 でBarはやりたくないことですfoo#show。単一のクエリですべてをロードできるため、それぞれを個別にロードするよりもはるかに高速です。

それで、私がしたことはBar、通常のビューの代わりに のビューをパーシャルにすることです。そうすれば、コントローラーと別のビューの両方からレンダリングできます。

ここでの問題は、データベースからレコードをロードする以外に、これらのビューにはさらに準備が必要であり、Barレコードのロードとは異なり、パーシャルがコントローラーからレンダリングされるか、別のビューからレンダリングされるかに関係なく、これらの準備を行う必要があることです。

今やっているのは、パーシャルの先頭に10行くらいのルビブロックを置いて、そこで下erb準備をしているところです。それはうまくいきますが、私はそれが悪い設計であることを認識しています.そのような準備は、ビューではなくコントローラで行う必要があります. さらに悪いことに、showパーシャルの準備コードがedit代わりにパーシャルをレンダリングする必要があると判断する場合があるため、パーシャルから別のパーシャル レンダーを呼び出す必要がありますshow

ただし、そのコードをどこに置くべきかわかりません。ビューヘルパーにしようと思ったのですが、ビューヘルパーはビューから呼び出されるはずで、これもコントローラーから呼び出す必要があります。

では、この問題を解決する RoR の方法は何でしょうか?

4

1 に答える 1

1

コントローラーメソッドを作成しないのはなぜですか? コントローラーのメソッドをアクションにバインドする必要はないことに注意してください。コントローラーはアプリ内の単なる別のクラスです。このコントローラー メソッドは、パーシャルで使用できる状態 (コントローラーの変数) を設定できます。また、前述のコントローラのアクション メソッドは、そのメソッドの観点から実装できます (つまり、必要なデータを取得/準備するために呼び出します)。

class MyController < ApplicationController
  def show
    @intermediate_state = another_method
  end

  private
  def another_method
    "some value is returned here!"
  end
end

ビュー/部分:

<%= @intermediate_state %>
于 2013-04-10T23:13:10.500 に答える