kst*_*tis 7 ruby ruby-on-rails erb ruby-on-rails-5
在 Rails 5.2.3 中,我需要渲染一个带有可选块的部分。
# users/_user.html.erb
...
<% if block_given? %>
<%= yield %>
<% else %>
<h1>Goodbye world</h1>
<% end %>
...
Run Code Online (Sandbox Code Playgroud)
但是,block_given?
无论我选择使用哪个版本,都会返回 true:
<%# Version 1 - block_given? returns true %>
<%= render partial: "users/_user" do %>
<h1>hello world</h1>
<% end %>
<%# Version 2 - block_given? also returns true %>
<%= render partial: "users/_user" %>
Run Code Online (Sandbox Code Playgroud)
这里发生了什么,为什么会这样?
因为所有的 Rails 模板都支持content_for :xyz
,它由 触发yield :xyz
,这意味着所有的模板总是被包裹在一个准备好获取这些content_for
数据的块中。
因为这个预编程的块总是在那里,为了容纳content_for
,它意味着block_given?
将始终返回真。
我认为这实际上可能是 Rails 视图设计中的一个小疏忽。如果我们有一个单独的方法来检测是否为部分提供了一个块,那就太好了。
解决方法的一个想法:
<% if (block = yield).empty? %>
<h1>Goodbye world</h1>
<% else %>
<%= block %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
326 次 |
最近记录: |