Урожай и регистр по умолчанию || не выводить регистр по умолчанию - PullRequest
9 голосов
/ 25 мая 2010

У меня есть простой вариант использования yield и по какой-то неизвестной причине регистр по умолчанию никогда не отображается:

В моем макете super_admin у меня есть:

<%= yield :body_id || 'super_admin_main' %>

Мой контроллер

class Superadmin::GolfsController < ApplicationController
  layout "super_admin"

  def show 

  end
end

Мой вид шоу

С или без

<% content_for(:body_id) do %>sadmin_golfs<% end %>

С : показывается sadmin_golfs.

без : вместо super_admin_main отображается пустая строка

Может ли кто-нибудь воспроизвести такое же поведение?

Ответы [ 7 ]

26 голосов
/ 01 августа 2010

Попробуйте <%= yield(:title).presence || 'My Default Title' %>

Object#presence эквивалентно object.present? ? object : nil (AS 3 rc docs) и по существу допускает традиционный синтаксис с заголовками.

19 голосов
/ 25 мая 2010

Используйте скобки:

<%= (yield :body_id) || 'super_admin_main' %>

Или

<%= yield(:body_id) || 'super_admin_main' %>

Без них предполагается yield (:body_id || 'super_admin_main')

EDIT: Rails 3 использует ActiveSupport::SafeBuffer вместо string / nil (Rails 2), поэтому вывод не равен nil, даже если не предоставлено content_for. Так что попробуйте:

<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%>
3 голосов
/ 26 мая 2010

Почему бы не проверить, существует ли content_for или не определено в компиляции представления.

В коде content_for мы можем видеть:

def content_for(name, content = nil, &block)
  ivar = "@content_for_#{name}"
  content = capture(&block) if block_given?
  instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe)
  nil
end

Так что в вашем случае, @content_for_body_idэто определить, если content_for по вашему мнению.

Вы можете сделать:

<%=  instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %>

Если вы предпочитаете, вы можете создать помощника после

def yield_or(part, result)
  instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : result
end

и вызвать егона ваш взгляд

<%= yield_or(:body_id, 'super_admin_main') %>

Это работает только с Rails 2.3.x

В Rails 3:

есть этот метод content_for

1 голос
/ 09 марта 2011

Я знаю, что это старый вопрос, но у меня есть решение для Rails 2.3.

Я продлил метод shingara yield_or , описанный выше, и теперь он может принимать блок:

module ApplicationHelper
  def yield_or(name, content = nil, &block)
    ivar = "@content_for_#{name}"

    if instance_variable_defined?(ivar)
      content = instance_variable_get(ivar)
    else
      content = block_given? ? capture(&block) : content
    end

    block_given? ? concat(content) : content
  end
end

и это можно использовать в ваших шаблонах:

<% yield_or :something do %>
    <p>something else</p>
<% end %>

или

<%= yield_or :something, 'something else' %>
1 голос
/ 26 мая 2010

В рельсах 3

вызывает неопределенный метод `present '

0 голосов
/ 21 июля 2015

Вы можете использовать content_for?(:body_id), код будет таким.

<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %>
0 голосов
/ 18 марта 2015
<div class= <%= (yield :content_with_bunners).present? ? yield(:content_with_bunners) : "col-md-10"%>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...