对列表和详细信息视图使用相同的部分,如何区分?

时间:2015-10-01 09:47:10

标签: ruby-on-rails

所以我使用相同的部分来列出博客项目并显示完整的项目。问题是详细视图不需要包含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))

4 个答案:

答案 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 %>