根据条件渲染,rails

nkt*_*kyo 1 ruby ruby-on-rails

我有一个显示嵌套关系的表单.渲染嵌套子对象的调用如下所示:

<% if @fpimgblocks %>
??<% f.fields_for @fpimgblocks do |builder| %>
????<%= render 'fpimgblock_fields', :f => builder %>
??<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

@fpimgblocks是一个查找的结果,我已经验证了没有结果,所以我希望这不会渲染.但是,即使未初始化对象,也会呈现局部.然后,当我提交表单时,这会返回一个nil_class错误.

if语句中的语法是错误还是什么?我已经尝试过更改为"除非@ fpimgblocks.nil?但没有变化.

Jai*_*yer 6

@fpimgblocks并不像你期望的那样是零.因为它是查找的结果,所以它实际上是一个空数组.改变这个:

<% if @fpimgblocks %>
Run Code Online (Sandbox Code Playgroud)

对此:

<% unless @fpimgblocks.empty? %>
Run Code Online (Sandbox Code Playgroud)

它会奏效.我希望这有帮助!

  • .空白?在这种情况下可能更好,因为它处理@fpimgblocks为零的情况.否则@ fpimgblocks.empty?会导致NoMethodError. (2认同)
  • 你是对的,它会 - 虽然我喜欢`空? - 因为它更具体,而且当你调用`Object.all`或`Object.find(:all)时,你永远不会得到一个nil的情况`,这个例子就是这种情况. (2认同)