Ruby on rails ulli中的Rails呈现集合

Ruby on rails ulli中的Rails呈现集合,ruby-on-rails,collections,haml,render,partial,Ruby On Rails,Collections,Haml,Render,Partial,我有一个叫做Post的模型,我很想用一个局部+一个布局来实现以下目标 渲染单个对象时,输出: %div= post.body %ul %li= post.body %li= post.body %li= post.body 渲染集合时,输出: %div= post.body %ul %li= post.body %li= post.body %li= post.body 目前我有一个部分posts/post.haml,看起来像:%li=post.body 每当我

我有一个叫做Post的模型,我很想用一个局部+一个布局来实现以下目标

渲染单个对象时,输出:

%div= post.body
%ul
  %li= post.body
  %li= post.body
  %li= post.body
渲染集合时,输出:

%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%的用例中,我呈现的是一个post集合,但是post部分不能作为独立模板使用是没有意义的


    我想我可以做一些类似的事情

    # view
    render partial: 'post', collection: @posts, layout: 'list_of_posts'
    
    # list_of_posts
    %ul= yield
    
    # posts/post
    %li= post.body
    
    # 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
    
    这将解决我的第一个问题,如果它工作,但它没有。显然,render_集合不使用布局选项,因此它实际上是我在rendering集合中发现的一条死胡同。(U模板可能会起作用,但是

  • 作为间隔符绝对不是一个好的代码
  • 哈姆尔不允许这样做)

  • 至于我的第二个问题,一个简单的解决方法是在div中呈现所有内容,但是当事情应该在列表中时,我真的不愿意这样做。但为了让它发挥作用,它可能是唯一干净的解决方案<代码>部门职位列表>部门职位而不是
    ul.posts>li


    我知道我总是可以做这样的事情

    # view
    render partial: 'post', collection: @posts, layout: 'list_of_posts'
    
    # list_of_posts
    %ul= yield
    
    # posts/post
    %li= post.body
    
    # 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
    

    这是到目前为止我能想到的最好/最干净的方法,有什么想法吗?

    你可以有一个部分,在部分内部,它可以检查传递给它的本地是一个集合还是一个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
    

    添加另一个分部,该分部呈现
    li
    标记,然后调用常规分部:

    - if posts.is_a? Post # single item
      %div= posts.body
    - else
      %ul
      - posts.each do |post|
        %li= post.body
    
    • app/views/posts/index.html.haml

      %ul.posts= render collection: @posts, partial: "posts/post_li"
      
      %li= render post
      
      = div_for post do
        ....
      
    • app/views/posts/_post_li.html.haml

      %ul.posts= render collection: @posts, partial: "posts/post_li"
      
      %li= render post
      
      = div_for post do
        ....
      
    • app/views/posts/_post.html.haml

      %ul.posts= render collection: @posts, partial: "posts/post_li"
      
      %li= render post
      
      = div_for post do
        ....
      

    谢谢。不幸的是,因为对于每一篇文章,我不仅仅是render
    post.body
    ,而是一大堆div和As以及span,让它们在部分中重复似乎是不可能的。我想我可以做
    -如果posts.is_a?Post=content\u-tag(:div)do-else=content\u-tag(:ul)do=content\u-tag(:li)do
    但是,除非我将Post.body html抓取到其他内容中(例如,另一部分内容),否则缩进将被弄乱。