Rails: `next` 方法在将其移动到 rails 部分后停止工作 - 下一个错误无效

Rails: `next` method stops working after moving it to rails partial - Invalid next error

我当前的 ERB 文件如下(工作正常),

<div>
  <% [1,2,3,4,5].each do |el| %>
    <% next if (el == 1) %>
    <span><%= el %></span>
  <% end %>
</div>

在我尝试重构代码并使用 rails 部分后,它看起来如下,

<div>
  <% [1,2,3,4,5].each do |el| %>
    <%= render partial: "element", locals: {el: el} %>
  <% end %>
</div>

而我的部分 _element.html.erb 是,

<% next if (el == 1) %>
<span><%= el %></span>

此重构导致问题 SyntaxError (_element.html.erb:40: Invalid next)

我不确定为什么 next 在将其移动到部分后停止工作。任何解决方法将不胜感激。

提前致谢!

您当前问题的答案:

Next 不能在块的上下文之外使用,这是有充分理由的。您希望它如何运作

 def some_method(s)
   next unless s
   s
 end

显然在块内它可能有意义

[nil,2,3,nil,4].map {|n| some_method(n) } # sure kind of makes sense
#but what happens when I call
some_method(nil)
#how would you like it to use the next call here
#next what; there is no next; you have reached the end of the universe 

可行的解决方法

由于您对这个概念相当了解,而我评论中的代码似乎对您来说是不可接受的。你可以试试这个:

<div>
    <% [1,2,3,4,5].each do |el| %>
        <%= render partial: "element", locals: {el: el} %>
    <% end %>
</div>

部分_element.html.erb

 <%= content_tag(:span,el) unless el == 1 %>

您可以用 el == 1 代替您的实际情况,但如果条件为真,则不会呈现 span 标签,否则会呈现

 <span>Whatever el is here</span>

#content_tag Docs 因为我发现它比使用 html_saferaw 好多了,除非你真的需要。

请记住,部分被编译到动态生成的视图 class 中的方法中,您可以通过替换 return 而不是 next 来获得所需的效果。它将使部分模板的渲染短路,循环将继续枚举的下一个元素。

因此您的部分 _element.html.erb 将显示为:

<% return if (el == 1) %> <span><%= el %></span>