所以我使用相同的部分来列出博客项目并显示完整的项目。问题是详细视图不需要包含blog-image和blog-title中的链接。这种情况的最佳做法是什么?
我想过检查一个局部变量,它确定是否调用了详细视图,但不知怎的,我无法让它工作:
呼叫:
render @post, locals: {detail: 'true'}
部分:
link_to post.title, post if not defined? detail
但不知何故,局部变量不会传递给局部变量。
编辑:
好的,我现在更进一步了:
#index.html.haml
= render @posts
#show.html.haml
= render @post
#post/_post.html.haml
= post_counter
编辑2:好的,解决了......如果haml中的语句需要完整的括号,那么嵌套有点令人头疼
#post/_post.html.haml
.blog-post
.blog-post-image
= (defined? post_counter) ? link_to(image_tag(post.cover_image(:large)), post) : image_tag(post.cover_image(:large))
答案 0 :(得分:2)
我会做以下事情:
#app/views/posts/index.html.erb
<%= render "post", collection: @posts %>
#app/views/posts/show.html.erb
<%= render @post %>
#app/views/posts/_post.html.erb
<%= collection ? link_to(post.title, post) : post.title %>
<%= post.body unless collection %>
我从这篇SO帖子中得到了collection
var:
Rails: Render collection partial: Getting size of collection inside partial
如果您想跟踪集合部分的索引,您还可以将[partial_name]_counter
作为本地变量。
-
根据更新的问题:
答案是使用
post_counter
:.blog-post .blog-post-image = (defined? post_counter) ? link_to(image_tag(post.cover_image(:large)), post) : image_tag(post.cover_image(:large))
答案 1 :(得分:0)
这可能不是最好的方法,但你可以将变量(本地人)传递给模板部分。 (正如你所做的那样)。
你的努力很好,但是render @post
是铁路魔法,会忽略当地人。
应该双向工作
-@post.each do |post|
render partial "post", locals: {detail: true}
或
render partial "post", collection: @posts, as: post, locals: {detail: true}
答案 2 :(得分:0)
我只是检查params hash
+--------+--------------+-------------+
| UserId | AptitudeMark | EnglishMark |
+--------+--------------+-------------+
| 1 | 25 | 45 |
| 2 | 34 | NULL |
| 3 | NULL | 45 |
| 4 | 56 | 66 |
+--------+--------------+-------------+
如果您在其他地方也使用它,您可能也想检查控制器
link_to post.title, post if params[:action] == "index"
答案 3 :(得分:0)
用于渲染单个帖子:
<%= render @post %>
用于渲染帖子集合:
render partial "post", collection: @posts, as: post, locals: { detail: true }
在_post
部分中,在开头添加以下行:
<% detail ||= false %>
现在您已初始化detail
参数。无需defined?
功能:
<% unless detail %>
<%= link_to post.title, post %>
<% end %>