【问题标题】:Rails erb check if exist and do eachRails erb 检查是否存在并执行每个
【发布时间】:2015-09-09 09:36:27
【问题描述】:

在一个 erb 文档上,我有一个可能未定义的数组。所以我检查是否存在,如果存在,我会像这样迭代:

<% if defined? my_array %>
  <% my_array.each do |item| %>
    <%# do stuff %>
  <% end %>
<% end %>

我想知道我是否可以在一行中包含条件和循环。

你有什么想法吗?

【问题讨论】:

  • 我认为您已经拥有的内容完全可读并且不会产生任何问题。你为什么要改变它?编码不是谁可以拥有最少代码行数的竞赛。
  • 是的,我知道,我只是认为检查我是否可以迭代一个变量然后进行迭代有点多余......
  • 我不认为这是多余的。测试它是否存在然后迭代它是两件完全不同的事情。冗余是指您两次执行相同的操作。

标签: ruby-on-rails ruby loops conditional-statements


【解决方案1】:

我认为使用&amp;. 是可行的方法

<% my_array&.each do |item| %>
  <%# do stuff %>
<% end %>

【讨论】:

    【解决方案2】:

    您可以在每个块上调用#try。这需要添加少量代码,但请记住 using try is considered by some to be a code smell

    <% my_array.try(:each) do |item| %>
      <%# do stuff %>
    <% end %>
    

    【讨论】:

      【解决方案3】:

      您可以利用nil.to_a[] 的事实,而Array#to_a 只是返回自身,没有改变。

      <% my_array.to_a.each do |item| %>
        <%# do stuff %>
      <% end %>
      

      但这取决于什么是“可能不存在”,我认为这意味着“可能是nil”。
      例如,false.to_a 将不起作用。

      【讨论】:

      • @Nobe4 你明白了,你需要知道可能的类型:)
      【解决方案4】:

      我认为更好的方法是尽可能从控制器初始化数组,例如

      @my_array ||= []
      

      这样.each 调用仍然可以工作,但不会循环,因为数组是空的,所以你不需要检查它。

      【讨论】:

      • 你认为这样的分配可以在视图中完成吗?
      • 可以,你可以用专线写这个语句my_array ||= [],或者做类似(my_array || []).each的事情
      • 如果它是一个局部变量,而不是一个实例变量,你不能说my_array ||= [],因为如果它没有定义它会爆炸(不像实例变量,如果它们没有定义则返回nil )。你需要说my_array = [] unless defined?(my_array)
      【解决方案5】:

      我觉得它不是很地道,但你可以这样做:

      <% my_array.each do |item| %>
        <%# do stuff %>
      <% end if defined? my_array %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 2011-06-10
        • 2011-09-29
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多