7

WebサイトをRails2(最新)からRails 3(beta2)に移行しています。Ruby1.9.1p378およびRuby1.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などの例を含めることができます。このブロックが設定されている場合、内部のpiceHTMLはでレンダリングされapplication.html.erbます。そうでない場合、Railsは右側
のPartialをレンダリングする必要があります。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アプリケーションでうまく機能しました。
現在、Rails 3 (beta2)ではyield、パーツのみが機能しています。

|| render('shared/sidebar')

サイドはorレールやおそらくルビーでは処理されません。

入力と時間をありがとう!

4

4 に答える 4

7

railscasts.comのRyanBatesがエピソード#227で示しています-Rails 3 Part 3へのアップグレードcontent_for?()(2:45分のビデオ再生)を使用したソリューション

私はそれが私たちがそれを使うべき方法だと思います:

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
于 2010-09-06T19:29:43.080 に答える
3

これをテストしたところ、Rails3がnilではなく空の文字列を返しているようです。したがって、最終リリースの前にこれを変更しない限り、コードを変更して、値がnilではなく空白かどうかを確認する必要があります。

(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar")
于 2010-04-10T13:43:22.683 に答える
3

私は通常、サイトのタイトルを次のように設定します。

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

それはまだ醜いですが、少し少ないです:)

于 2010-09-21T09:45:20.260 に答える
3

MikeDottererに感謝します。私はあなたの考えを取り入れて、それを少し修正しました。

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

object.presenceはobject.presentと同等ですか??オブジェクト:nil

提供vscontent_for

于 2013-02-11T16:21:26.033 に答える