Ruby on rails ulli中的Rails呈现集合
我有一个叫做Post的模型,我很想用一个局部+一个布局来实现以下目标 渲染单个对象时,输出: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 每当我
%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
问题是:
我想我可以做一些类似的事情
# 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 ....
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抓取到其他内容中(例如,另一部分内容),否则缩进将被弄乱。