代码之家  ›  专栏  ›  技术社区  ›  rzar

Rails 3-yield return或callback不会在视图中调用<%=yield(:sidebar)| | render('shared/sidebar')%>

  •  7
  • rzar  · 技术社区  · 16 年前


    测试 红宝石1.9.1p378 和 红宝石1.9.2dev (2010-04-05行李箱27225)

    yield 是个问题,但我不清楚。

    在布局文件中,我经常使用以下技术:

    app/views/layouts/application.html.erb :

    <%= yield(:sidebar) || render('shared/sidebar') %>
    

    例如,局部视图如下所示:

    app/views/shared/_sidebar.html.erb :

    <p>Default sidebar Content. Bla Bla</p>
    


    在任何视图中,我都想创建一个 content_for 块(可选)。这可以包含一个HTML等图片。下面的例子。如果设置了此块,则内部的pice HTML应该呈现为 application.html.erb
    如果不是,Rails应该在 shared/_sidebar.html.erb

    app/views/books/index.html.erb :

    <% content_for :sidebar do %>
        <strong>You have to read REWORK, a book from 37signals!</strong>
    <% end %>
    

    所以你有主意了。有希望地。这种技术在任何Rails2.x应用程序中都能很好地工作。
    现在,在 轨道3 (β2) 只有 部分工作正常。

    || render('shared/sidebar')
    

    这个 or side不会通过rails或者ruby进行处理。

    感谢您的投入和时间!

    4 回复  |  直到 16 年前
        1
  •  7
  •   rzar    16 年前

    railscasts.com上的Ryan Bates在第集的节目中 #227 - Upgrading to Rails 3 Part 3 解决方案 content_for?() (视频播放时间为2:45分钟)

    content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
    
        2
  •  3
  •   Mike Dotterer    16 年前

    我测试了这个,看起来Rails3返回的是空字符串而不是nil。因此,除非他们在最终版本之前更改此值,否则您必须修改代码以查看该值是否为空而不是仅为零。

    (sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar")
    
        3
  •  3
  •   WEFX venkateswararao    13 年前

    我通常将网站标题设置为:

    <title><%= ['My Site', yield(:title)].compact.join(' - ') %></title>
    

    由于此更改,添加一些条件会很难看,因此我创建了一个助手,如下所示:

    module ApplicationHelper
        def nil_empty(str)
            str.blank? ? nil : str
        end
    end
    

    然后我可以这样做:

    <title><%= ['My Site', nil_empty(yield :title)].compact.join(' - ') %></title>
    

        4
  •  3
  •   Jason Deppen    13 年前

    谢谢迈克·多特瑞。我接受了你的想法,做了一些修改。

    yield(:sidebar).presence || render("shared/sidebar")
    

    object.presence is equivalent to object.present? ? object : nil

    provide vs content_for