在一个erb文档中,我有一个可能未定义的数组。所以我检查是否存在,如果它存在,我迭代如下:
<% if defined? my_array %>
<% my_array.each do |item| %>
<%# do stuff %>
<% end %>
<% end %>
而且我想知道我是否可以在一条线上拥有条件和循环。
你有好主意吗 ?
我认为更好的方法是在可能的情况下从控制器初始化数组,例如
@my_array ||= []
这样.each
调用仍然可以工作,但不会循环,因为数组是空的,所以你不需要检查它。
你可以利用nil.to_a
是[]
的事实,而Array#to_a
只是返回自己,没有改变。
<% my_array.to_a.each do |item| %>
<%# do stuff %>
<% end %>
但这取决于“可能不存在”,我认为这意味着“可能是nil
”。
例如,false.to_a
将不起作用。
你可以在每个区块上调用#try
。这需要添加一些代码,但请记住using try is considered by some to be a code smell。
<% my_array.try(:each) do |item| %>
<%# do stuff %>
<% end %>
我觉得它不是很惯用,但你可以这样做:
<% my_array.each do |item| %>
<%# do stuff %>
<% end if defined? my_array %>
我认为使用&.
是要走的路
<% my_array&.each do |item| %>
<%# do stuff %>
<% end %>