【问题标题】:Rails render collection in ul liul li 中的 Rails 渲染集合
【发布时间】:2012-11-14 16:15:40
【问题描述】:

我有一个名为 Post 的模型,我很想只使用 ONE partial + ONE 布局来实现以下目标。

渲染单个对象时,输出:

%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 的部分不能用于单个对象

虽然在我 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 不允许这样做)

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

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

【问题讨论】:

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


    【解决方案1】:

    添加另一个渲染 li 标记的部分,然后调用常规部分:

    • app/views/posts/index.html.haml

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

      %li= render post
      
    • app/views/posts/_post.html.haml

      = div_for post do
        ....
      

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。不幸的是,因为对于每个帖子我都不会只是渲染post.body,这将是一大堆 div 和 As 和 span,让它们在部分中重复似乎是不理想的。我想我可以做到- if posts.is_a? Post = content_tag(:div) do else = content_tag(:ul) do = content_tag(:li) do ,但是除非我将 post.body html 抓取到其他内容中(例如,另一个部分),否则缩进会变得混乱。
      猜你喜欢
      • 2011-08-06
      • 2012-03-21
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多