6

私は 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

問題は次のとおりです。

  1. コレクションをレンダリングするたびに、レンダリングを %ul に配置する必要があります
  2. パーシャルは、%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 は機能する可能性がありますが、

  1. </li><li>スペーサーは決して良いコードではありません..
  2. 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

これは、これまでのところ私が思いつくことができる最善/最もクリーンな方法です。何か考えはありますか?

4

2 に答える 2

1

liタグをレンダリングして通常のパーシャルを呼び出す別のパーシャルを追加します。

  • アプリ/ビュー/投稿/index.html.haml

    %ul.posts= render collection: @posts, partial: "posts/post_li"
    
  • アプリ/ビュー/投稿/_post_li.html.haml

    %li= render post
    
  • アプリ/ビュー/投稿/_post.html.haml

    = div_for post do
      ....
    
于 2012-11-14T19:20:19.170 に答える
1

単一のパーシャルを持つことができ、パーシャル内では、渡されたローカルがコレクションまたは単一の Post オブジェクトであるかどうかを確認できます。

# Render calls
render :partial => "posts/display_posts", :locals => {:posts => Post.first}
render :partial => "posts/display_posts", :locals => {:posts => Post.all} # collection

そしてあなたの部分:

- if posts.is_a? Post # single item
  %div= posts.body
- else
  %ul
  - posts.each do |post|
    %li= post.body
于 2012-11-14T16:21:51.653 に答える