如何检查 view partial 的 locals 中是否传入了某变量

发表于:
标签:
编辑 删除

参考:

  1. optional local variables in rails partial templates: how do I get out of the (defined? foo) mess? - StackOverflow
  2. Should the extensive use of local_assigns.has_key? in partial be considered a code smell? - StackOverflow
  3. defined? method in Ruby and Rails - StackOverflow
  4. ActiveView::Base - RubyonRails 官方文档

If you need to find out whether a certain local variable has been assigned a value in a particular render call, you need to use the following pattern:
如果需要确定 partial view 中某个局部变量是否被赋值(包括通过 :locals 传入的变量),Rails 官方建议可使用 local_assigns 的 has_key? 方法,如下:

<% if local_assigns.has_key? :headline %>
  Headline: <%= headline %>
<% end %>

官方对不建议使用 defined? 的原因做了如下简单解释:

Testing using defined? headline will not work. This is an implementation restriction.

看到 SackOverflow 上确实用人提出了使用 defined? 来检查局部变量是否定义会很不靠谱,所以统一使用 local_assigns,具体原因后面再看看 Rails 源码深挖。