Rails 3 - возвращение yield или обратный вызов не будут вызываться в поле зрения <% = yield (: sidebar) || render ('shared / sidebar')%> - PullRequest
7 голосов
/ 10 апреля 2010

Я перевожу сайт с Rails 2 (последний) на Rails 3 (beta2).
Тестирование с Ruby 1.9.1p378 и Ruby 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 и т. Д. Пример ниже. Если этот блок установлен, внутренний фрагмент HTML должен отображаться в 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 %>

Итак, у вас есть идея. С надеждой. Этот метод хорошо работал в любом приложении Rails 2.x.
Теперь в Rails 3 (бета2) работает только yield Part.

|| render('shared/sidebar')

Сторона or не будет обрабатываться рельсами или, может быть, рубином.

Спасибо за ввод и время!

Ответы [ 4 ]

7 голосов
/ 06 сентября 2010

Райан Бейтс с railscasts.com показывает в эпизоде ​​ # 227 - Обновление до Rails 3 часть 3 решение с content_for?() (воспроизведение видео в 2:45 мин)

Я думаю, вот как мы должны это использовать:

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar")
3 голосов
/ 11 февраля 2013

Спасибо, Майк Доттерер. Я взял вашу идею и немного ее изменил.

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

object.presence эквивалентно object.present? ? объект: ноль

предоставить против content_for

3 голосов
/ 21 сентября 2010

Я обычно устанавливаю заголовок моего сайта с помощью:

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

Это все еще уродливо, но немного меньше:)

3 голосов
/ 10 апреля 2010

Я проверил это, и похоже, что Rails 3 возвращает пустую строку вместо nil. Поэтому, если они не изменят это до окончательного выпуска, вам придется изменить свой код, чтобы увидеть, является ли значение пустым, а не просто нулем.

(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...