Rails перевіряють, чи визначена в yield_for область yield:


97

Я хочу зробити умовний візуалізацію на рівні макету на основі визначеного фактичного шаблону content_for(:an__area), будь-яка ідея, як це зробити?


Дивіться мою відповідь щодо створення допоміжного методу для інкапсуляції цієї поведінки в Rails 3.
tristanm

Відповіді:


217

@content_for_whateverзастаріло. Використовуйте content_for?замість цього:

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

16
Помічник content_for?існує лише в Rails 3. У Rails 2 ви можете використовувати @content_for_...змінну екземпляра.
не

10

насправді не потрібно створювати допоміжний метод:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

тоді, звичайно, на ваш погляд:

<% content_for :sidebar do %>
  ...
<% end %>

Я використовую це весь час, щоб умовно переходити від одного стовпця до двох стовпців



2

Може створити помічника:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

І використовуйте це у своєму макеті:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією.
eirikir

Я згоден @eirikir, не впевнений, що думав мій 6 років молодший. Я продовжую і залишаю свою відповідь для тих, хто все ще знаходиться на Rails 2 .. без зайвої преамбули;)
Нік

1

Добре, я збираюся безсоромно відповісти самостійно, оскільки ніхто не відповів, і я вже знайшов відповідь :) Визначте це як допоміжний метод або в application_helper.rb, або там, де вам це зручно.

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end

Хе, добре, мені подобається ваша самовідповідь, але ... Мінор, instance_variable_defined?(content_var_name)трохи акуратніше, ніж замість того, щоб перевірити, чи є він нульовим. Другий більший момент - змінна екземпляра content_for застаріла, тому ваше рішення не є надійним у майбутньому
Dave Nolan

1

Я не впевнений у наслідках продуктивності виклику yield двічі, але це буде робити незалежно від внутрішньої реалізації yield (@content_for_xyz застарілий) і без зайвого коду або допоміжних методів:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.