【问题标题】:Using the same partial for lists and detail view, how to differentiate?列表和详细视图使用相同的部分,如何区分?
【发布时间】:2015-10-02 02:29:01
【问题描述】:

所以我使用相同的部分来列出博客项目并显示完整项目。问题是详细视图不需要包含博客图像和博客标题中的链接。这种情况下的最佳做法是什么?

我想检查一个确定是否调用详细视图的局部变量,但不知何故我无法让它工作:

呼叫:

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中的if语句需要完整的括号

#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))

【问题讨论】:

  • 请发布完整的部分和全部

标签: ruby-on-rails


【解决方案1】:

我会做以下事情:

#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))

【讨论】:

  • 我收到一个错误,指出集合不是有效的数学或变量...你确定它真的存在吗?将是一个完美的解决方案。
  • 它显然在 Rails 4.2 稳定源中。您使用的是哪个版本的 Rails?
  • 让我看看这个。如果是这样,那将是史诗般的
  • 在 Rails 2.4 上为我工作 - 我们必须分配 collection var,我会更新
  • 如果您编辑您的回复以包含我对 post_counter 的使用,我会将您的回答标记为解决方案!
【解决方案2】:

这可能不是最好的方法,但您可以将变量(本地)传递给模板部分。 (就像你一样)。

你的努力很好,但 render @post 是 rails 的魔法,会忽略本地人。

应该双向工作

-@post.each do |post|
  render partial "post", locals: {detail: true}

render partial "post", collection: @posts, as: post, locals: {detail: true}

【讨论】:

    【解决方案3】:

    我只是检查参数哈希

    link_to post.title, post if params[:action] == "index"
    

    如果你也在其他地方使用它,你可能也想检查控制器

    link_to post.title, post if params[:action] == "index" && params[:controller] == "posts"
    

    【讨论】:

    • 不知道。有些人只是愚蠢。你的也是一个合法的方法,但你可以使用 action_name 和 controller_name ;)
    • @huanson 不知道,你能从视图中做到吗?
    • 当然,为什么不呢?如果没有,使其可访问;)
    【解决方案4】:

    用于渲染单个帖子:

    <%= 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 %>
    

    【讨论】:

    • 在节目中将细节作为错误传递不是更有意义,而不是在视图中显示detail ||= false
    • @japed 写&lt;%= render @post %&gt;不是更好吗?
    • 个人偏好我想,但我不喜欢在视图中分配变量。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多