Rails渲染集合在ul li中

时间:2012-11-14 16:15:41

标签: ruby-on-rails collections haml render partial

我有这个名为Post的模型,idaelly我很想使用一个局部+一个布局来实现以下目的。

渲染单个对象时,输出:

%div= post.body

在渲染集合时,输出:

%ul
  %li= post.body
  %li= post.body
  %li= post.body

目前我的部分帖子/ post.haml看起来像:%li= post.body

每当我渲染一个集合时,我都会%ul=render @posts

问题是:

  1. 每当渲染一个集合时,我都必须将渲染放在%ul
  2. 部分不适用于没有%ul的单个对象
  3. 虽然在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不允许这样做)

    3. 至于我的第二个问题,一个简单的方法就是渲染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
      

      这是迄今为止我能想出的最好/最干净的方式,有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
      ....