私は Post と呼ばれるこのモデルを持っています。理想的には、以下を実現するために 1 つの部分 + 1 つのレイアウトのみを使用したいと考えています。
単一のオブジェクトをレンダリングするときは、次を出力します。
%div= post.body
コレクションをレンダリングすると、次のように出力されます。
%ul
%li= post.body
%li= post.body
%li= post.body
現在、次のような部分的な posts/post.haml があります。%li= post.body
コレクションをレンダリングするときはいつでも、私はそうします%ul=render @posts
問題は次のとおりです。
- コレクションをレンダリングするたびに、レンダリングを %ul に配置する必要があります
- パーシャルは、%ul のない単一のオブジェクトには使用できません
私の使用例の 90% では投稿のコレクションをレンダリングしていますが、投稿の部分がスタンドアロンのテンプレートとして使用できないのは意味がありません。
私は次のようなことができると思った
# view
render partial: 'post', collection: @posts, layout: 'list_of_posts'
# list_of_posts
%ul= yield
# posts/post
%li= post.body
これは、それが機能する場合、私の最初の問題を解決しますが、そうではありません。どうやらrender_collectionはレイアウトオプションを取らないので、コレクションのレンダリングで見つけられるものからは実質的に行き止まりです。( Spacer_template は機能する可能性がありますが、
</li><li>
スペーサーは決して良いコードではありません..- Haml はこれを許可しません)
私の 2 番目の問題については、すべてを div でレンダリングするのが簡単な方法ですが、物事をリストに入れる必要があるときにそうするのは本当に気が進まないのです。しかし、それを機能させるためには、おそらくそれが唯一のきれいな解決策です。div.list-of-posts > div.post
それ以外のul.posts > li
私はいつでも次のようなことができることを知っています
# view - collection
%ul= render @posts, in_list: true
# view - object
= render @post
# posts/post.haml
- post_counter ||= false
- tag = post_counter ? :li : :div
= content_tag tag do
= post.body
ただし、この場合、コレクションが渡されるたびに %ul を配置する必要があります。
または、同様のことを行うことができますが、おそらく少しクリーンです。
# view - collection of objects
= render 'posts', posts: @posts
# view - object
= render @post
# posts/posts.haml
%ul
= render post
# posts/post.haml
- post_counter ||= false
- tag = post_counter ? :li : :div
= content_tag tag do
= post.body
これは、これまでのところ私が思いつくことができる最善/最もクリーンな方法です。何か考えはありますか?