Расхождение при захвате блока просмотра Rails - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть представление ERB с двумя блоками:

<%= test_h1 do %>
  <%= 'test1' %>
<% end -%>

<%= test_h2 do %>
  <%= 'test2' %>
<% end -%>

, где test_h1 и test_h2 - аналогичные помощники, но один определяется в файле помощника, а другой через helper_method вконтроллер:

module TestHelper
  def test_h1(&block)
    link_to '/url' do
      capture(&block)
    end
  end
end

class TestController < ApplicationController
  helper_method :test_h2

  def test_h2(&block)
    helpers.link_to '/url' do
      helpers.capture(&block)
    end
  end
end

test_h1 дает ожидаемый результат, а test_h2 сначала отображает внутренний блок шаблона:

<a href="/url">test1</a>

test2<a href="/url"></a>

Почему?Какой идиоматический способ написать test_h2?

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

capture переопределяет текущий выходной буфер и просто вызывает блок (который все еще связан с другим контекстом представления), таким образом, переопределение не действует при вызове из контроллера, потому что view_context не тот же контекст, в котором визуализируется представление.

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

# in controller
helper do
  def test_h3(&block)
    # this will run in view context, so call `controller.some_func` to access controller instance
    link_to '/url' do
      capture(&block)
    end
  end
end
0 голосов
/ 16 декабря 2018

Идематический способ сделать это в рельсах - переместить метод test_h2 в задачу и включить ее в контроллер, а также в класс помощников.Или определите test_h2 как helper_method в вашем классе контроллера.Но, как правило, методы, которые необходимы в нескольких местах, должны быть поставлены под сомнение и включать те проблемы, где это необходимо.Также, если вам нужны методы для представлений, включите проблемы или определите свои собственные методы внутри помощников.Обратитесь Можем ли мы вызвать метод контроллера из представления (как мы в идеале вызываем из помощника)? Как использовать проблемы в Rails 4

0 голосов
/ 17 декабря 2018

При использовании capture от вашего контроллера вывод добавляется в буфер страницы, в результате <%= из вашего эрба выводится немедленно на вывод страницы.

Чтобы обойти, вынужно использовать <% вместо этого в вашем блоке test_h2.Таким образом, чтобы получить ожидаемое поведение в обоих случаях, используйте этот синтаксис:

<%= test_h1 do %>
  <%= 'test1' %>
<% end -%>

<%= test_h2 do %>
  <% 'test2' %>
<% end -%>

Подробнее в этой статье: https://thepugautomatic.com/2013/06/helpers/

0 голосов
/ 14 декабря 2018

Я думаю, что оба примера представлений должны быть переписаны как:

<%= test_h1 do %>
  <% 'test1' %>
<% end -%>

<%= test_h2 do %>
  <% 'test2' %>
<% end -%>

Мое понимание того, что '<% =' заставляет рендерить вывод блока в выходной поток, который не былпредполагаемое поведение в этих двух примерах </p>

...