捕获Rails视图块时出现差异

Ale*_*rov 7 ruby-on-rails actionview ruby-on-rails-5

我有一个带有两个块的ERB视图:

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

<%= test_h2 do %>
  <%= 'test2' %>
<% end -%>
Run Code Online (Sandbox Code Playgroud)

where test_h1test_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
Run Code Online (Sandbox Code Playgroud)

test_h1生成预期结果并首先test_h2渲染内部模板块:

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

test2<a href="/url"></a>
Run Code Online (Sandbox Code Playgroud)

为什么?什么是惯用的写作方式test_h2

Vas*_*fed 2

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
Run Code Online (Sandbox Code Playgroud)