Awesome Nested Set gemを使用して階層を作成しています。この階層を表示します。Rails:dbから起動時にアコーディオンを動的に読み込む方法
私は部分的
を呼び出しています典型的なコントローラのアクション私のindexアクションでklasses_controller.rb
def index
@klasses = Klass.where(depth: 0).order('lft ASC')
end
klasses/index.rb
<div id="accordion" role="tablist" aria-multiselectable="true">
<% @klasses.each do |klass| %>
<%= render :partial => "klass", locals: {klass: klass} %>
<% end %>
</div>
とインデックスページを持っています
klasses/_klass.html.erb
<div class="klass">
<div class="klass-header" role="tab" id="heading-<%=klass.id%>">
<h5 class="mb-0">
<a data-toggle="collapse"
data-parent="#accordion"
href="#collapse-<%=klass.id%>"
aria-expanded="false"
aria-controls="collapse-<%=klass.id%>">
<%= klass.symbol + " : " + klass.title%>
</a>
</h5>
</div>
<div id="collapse-<%=klass.id%>"
class="collapse"
role="tabpanel"
aria-labelledby="heading-<%=klass.id%>">
<div class="klass-block">
<Here is where I want to render partial for each child>
</div>
</div>
</div>
これは標準のアコーディオンであり、そのまま動作します。ここに私は非常に大きなデータベースを持っていると私は不必要に何かをレンダリングしたくない問題です。ヘッダがクリックされるまで待ってから、非同期的にクラスiの子を取得し、同じ部分を使ってそれぞれをクリックしてレンダリングします。
どうすればこの問題を解決できますか?ルート/コントローラアクションの組み合わせを使用する方法はありますか?または、coffee/java-scriptの記述を開始する必要がありますか?私は誰もが歓迎される例を知っているので、ホイールを再発明しようとしていません。
'<それぞれの子に部分的にレンダリングしたい場所はあります> '領域で、各子を展開するリンクはどうでしょうか?リンクは子を示すajaxリクエストで、同じ部分的な '_klass.html.erb'をレンダリングし、リンクを部分的に置き換えます。新しくレンダリングされた子は、もちろんそれ自身の子を拡張するためのajaxリンクを持っています。 –
もし私がそれをしたら、少なくともリンクのそれぞれの子供の名前をロードしたいと思うでしょう。その場合、最初のインデックスアクションでルートノードの子ノードをロードする必要がありますか?ヘッダーのリンクをダブルデューティーで子供に呼びかけ、折り畳みパネルを開くことができますか? – mkrinblk
はい、最初のインデックスアクションで、ルートノードの子ノード名(およびリンクのパスのIDも)をロードできます。もう1つの選択肢は、すべての子どもの名前を取得したくない場合は、一般的な「子を展開」リンクまたはボタンを使用することです。はい、新しいデータを挿入するAJAXレスポンスの一部と同時にアコーディオンを拡張することもできます。 –