Урожай и случай по умолчанию || не производят случай по умолчанию

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

В моем 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

Кто-либо может воспроизвести то же поведение?

9
задан mu is too short 14 January 2012 в 06:08
поделиться

4 ответа

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

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

или

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

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

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

<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%>
19
ответ дан 4 December 2019 в 06:02
поделиться

Почему нет проверки, есть ли 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?

3
ответ дан 4 December 2019 в 06:02
поделиться

In rails 3

raises undefined method `present'

1
ответ дан 4 December 2019 в 06:02
поделиться

Попробуйте <% = yield (: title) .presence || «Мой заголовок по умолчанию»%>

Наличие № объекта эквивалентно object.present? ? object: nil (AS 3 rc docs), и по существу позволяет использовать традиционный синтаксис с заголовками.

26
ответ дан 4 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: