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_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
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?
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)