質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

843閲覧

[Rails]collectionをrenderするときパーシャルのなかにパーシャルがある場合の最適な実装

adagio

総合スコア4

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2019/10/03 02:02

前提・実現したいこと

index.slim

index.slim

1= render partial: 'model', collection: models
_model.slim

_model.slim

1= model.id 2 3= render 'model_infomartion', model: model

このような場合、collectionの恩恵を受けることができないと思うのですが、良い手段はないでしょうか。
よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2019/10/04 02:22

「collectionの恩恵を受けることができない 」 以前に、_model.slim で collection が参照されていないですね。これでは恩恵もなにも。。。。 どういう恩恵を受けたいのでしょう
adagio

2019/10/04 02:43 編集

> 以前に、_model.slim で collection が参照されていないですね。これでは恩恵もなにも。。。。 - models.each do |model| = render 'model', model: model とすると、renderが呼ばれるたびに`find_template`が呼ばれ、パフォーマンス的によろしくないという前提で、 以下のようにすると_model.slimを探すための`find_template`は一回で済みます。これが私が意図していた恩恵です。説明不足でした。 ``` = render partial: 'model', collection: models ``` ここまではあたりまえのことですが、_model.slimの中でrenderを呼び出すため、結局models.size分renderが呼び出され、find_templateもmodels.size分呼ばれます。 これを避けるためのアイデアがないかを質問しています。 よろしくおねがいします。
guest

回答2

0

_model_infomartionの中身がどれほどのものかわかりませんが、
パーシャルに分けずに_modelに含めてしまうというのが一番現実的なのかと思います。

量が多いとか他の場所でも使うとかだと現状の使い方が最適であり、
ある程度のパフォーマンス低下(?)について許容は必要になるかと思います。

collectionの恩恵を受けることができないと思うのですが、良い手段はないでしょうか。

_model.slimの中でrenderを呼び出すため、結局models.size分renderが呼び出され、find_templateもmodels.size分呼ばれます。

質問中と追記部分のこの内容についてですが、もしcollectionを使わない場合は、models.size * 2回分renderが呼ばれることになると思うので、collectionを使う恩恵に関してはそれを使った時点で受けていると思うのですがどうでしょうか?

投稿2019/10/04 04:57

Mugheart

総合スコア2344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なるほど。
templateを探す負荷が気になるほど models が大きいのでしょうか?

で、一般的に「最適」というのはわかりませんが、この例で考えると

model.slim は(ほぼ)これで全てですか?もしそうならばこれをindexに取り込んでも可読性は落ちないと思います。
それで templateを探す回数が半分になります。

= render partial: 'model', collection: models
とするならば partial model にて

- collection.each do |model| = model.id = render 'model_infomartion', model: model

とすることになるかと思いますが、これですと partial models になっちゃいますね。意味合い的にというか、ん〜〜〜 感覚的にというか、なんか感じ悪くないですか?

投稿2019/10/04 03:45

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mugheart

2019/10/04 04:59

そのサンプルコードだとNameErrorが起きてしまいますね...。 NameError (undefined local variable or method `collection' for main:Object) が発生すると思います...。
winterboum

2019/10/04 05:54

あれ?  = render partial: 'model', collection: models で collection が渡るかと思ったのですが
Mugheart

2019/10/04 05:57

= render partial: 'model', local: { collection: models } と書けばそうなりますけど、この場合の collection はオプションにあたります。
winterboum

2019/10/04 06:36

あ、そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問