hummingbird
@hummingbird

Как написать метод с «do» в Ruby?

Как написать аналог этому?

<%= content_tag :div, class: "strong" do %>
	Hello world!
<% end %>
  • Вопрос задан
  • 197 просмотров
Решения вопроса 2
miraage
@miraage
Старый прогер
Насколько я помню, это &block.

// EDIT

apidock.com/rails/ActionView/Helpers/TagHelper/con...

# File actionview/lib/action_view/helpers/tag_helper.rb, line 103
      def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
        if block_given?
          options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
          content_tag_string(name, capture(&block), options, escape)
        else
          content_tag_string(name, content_or_options_with_block, options, escape)
        end
      end


apidock.com/rails/ActionView/Helpers/CaptureHelper...

# File actionview/lib/action_view/helpers/capture_helper.rb, line 36
      def capture(*args)
        value = nil
        buffer = with_output_buffer { value = yield(*args) }
        if string = buffer.presence || value and string.is_a?(String)
          ERB::Util.html_escape string
        end
      end
Ответ написан
iKapex
@iKapex
Уже ответили, но я подрезюмирую:
ежели ты хочешь написать такой метод, который поддерживал такую конструкцию:
obj.your_method { |item| ... }
То тебе надо написать вот что:
def your_method(..., ..., &block)
  block.call(:somth)
end

соответственно, obj.your_method { |item| ... } -> item = :somth в этом случае

Это DSL называется
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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