在Rails view_component组件模板中使用yield是否可行?
问题根因
你当前的实现方式不可行,报错的核心原因是:View Component模板里的yield语法,指代的是组件被渲染时从调用方传入的代码块,而非传统Rails布局中用来输出对应action视图内容的全局yield上下文。
现在的渲染链路里,你在application.html.erb中执行<%= render BodyComponent.new %>时,没有给这个组件传入任何代码块,所以当BodyComponent的模板运行到<%= yield %>时,自然会抛出LocalJumpError: no block given (yield)。
可行的修正方案
只需要在布局层渲染BodyComponent时,把原本布局要输出的action视图内容作为代码块传给组件即可,修改后application.html.erb里的对应渲染代码为:
<%= render BodyComponent.new do %> <%= yield %> <% end %>
这里需要明确区分两层yield的语义差异:
- 块内部的
<%= yield %>是Rails原生布局的固定语法,作用是读取并输出当前controller action对应的视图模板内容 - 整段内容作为代码块传入BodyComponent后,BodyComponent自身模板里写的
<%= yield %>,就会准确读取到这个块的内容完成渲染,不会再触发块未传入的报错
注意事项
View Component不会自动继承上层布局的全局渲染上下文,所有要在组件内部展示的外部内容,都需要在调用组件时通过块、实例参数的方式显式传递,不能直接依赖布局层的全局yield逻辑。
内容的提问来源于stack exchange,提问作者Chanaka
相关产品推荐
相关产品推荐

