уступить, если содержимое, сделать что-то иначе (Rails 3) - PullRequest
11 голосов
/ 27 июля 2010

Я уже давно не в Rails, поэтому, может быть, я упускаю что-то простое.

Как этого добиться:

<%= yield_or :sidebar do %>
  some default content
<% end %>

Или даже:

<%= yield_or_render :sidebar, 'path/to/default/sidebar' %>

В первом случае я пытаюсь:

def yield_or(content, &block)
  content_for?(content) ? yield(content) : yield
end

Но это выдает ошибку «без блока».

Во втором случае:

def yield_or_render(content, template)
  content_for?(content) ? yield(content) : render(template)
end

Это работает, когда контент не определен, но как только я использую content_for для переопределения контента по умолчанию, он выдает ту же ошибку.отправная точка, но, похоже, она работает только при непосредственном использовании в представлении.

Спасибо!

Ответы [ 3 ]

14 голосов
/ 28 июля 2010

Как насчет этого?

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% else %>
  <div>default_content_here</div>
<% end %>

Вдохновение из этого вопроса SO

5 голосов
/ 14 сентября 2011

Попробуйте:

# app/helpers/application_helper.rb
def yield_or(name, content = nil, &block)
  if content_for?(name)
    content_for(name)
  else
    block_given? ? capture(&block) : content
   end
end

, чтобы вы могли сделать

<%= yield_or :something, 'default content' %>

или

<%= yield_or :something do %>
    block of default content
<% end %>

, где значение по умолчанию может быть переопределено с помощью

<%= content_for :something do %>
    overriding content
<% end %>
0 голосов
/ 28 июля 2010

Я не знал, что вы можете использовать content_for(:content_tag) без блока, и он будет возвращать тот же контент, что и при использовании yield(:content_tag).

Итак:

def yield_or_render(content, template)
  content_for?(content) ? content_for(content) : render(template)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...