【问题标题】:Refactoring Ruby重构 Ruby
【发布时间】:2016-03-22 19:37:37
【问题描述】:

我有三个数组,其中两个来自 JSON。

我需要检查每个数组是否不为零且计数大于0。如果有大于0,则显示“Hello World”,否则显示“Boo”。

<% if !@arrayOne.nil? && @arrayOne.count > 0 || !@user_json[:user_stuff].nil? && @user_json[:user_stuff].count > 0 || !@user_json[:more_user_stuff].nil? && @user_json[:more_user_stuff].count > 0 %>
<h1>Hello World</h1>
  <% else %>
<h1>Boo</h1>
<% end %>

我需要一些帮助来重构此代码,并想了解其他方法来解决此问题。

【问题讨论】:

    标签: ruby-on-rails arrays ruby refactoring


    【解决方案1】:

    你可以使用array.blank?(当然假设你使用Rails)来检查一个数组是nil还是空,例如:

    <% if !@arrayOne.blank? || !@user_json[:user_stuff].blank? || !@user_json[:more_user_stuff].blank? %>
    

    根据经验,您应该将尽可能多的逻辑移至控制器。


    按照cmets的建议,你也可以使用present?,和!blank?一样,提高可读性:

    <% if @arrayOne.present? || @user_json[:user_stuff].present? || @user_json[:more_user_stuff].present? %> 
    

    【讨论】:

    • 如果@arrayOnenil,这将抛出NoMethodError: undefined method 'blank?' for nil:NilClass。 (@user_json[:user_stuff]@user_json[:more_user_stuff] 相同)
    • @falsetru 你的意思是如果@arrayOne 等是undefined? AFAIK blank? 在测试空之前测试 nil,这样 nil.blank? 返回 true。
    • @falsetru blank? 是 Rails API 函数,而不是 Ruby 核心函数。叫空白? in irb 实际上会导致未定义的错误。
    • !foo.blank? 可以写成foo.present?。恕我直言,读起来很好。
    • 没有必要使用 Rails 来利用 blank?present?。见stackoverflow.com/questions/4238867/…
    【解决方案2】:

    你可以使用Enumerable#all?:

    <% if [!@arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]].all? { |x|
      x && x.count > 0
    } %>
      ...
    

    【讨论】:

      【解决方案3】:

      我会从这样的事情开始:

      if [@arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]].any?(&:present?)
      

      在下一步中,我将把这个条件移到一个有好名字的助手中。不幸的是,您没有提供为什么需要此检查(为什么会暗示一个好名字)。但作为一个想法:

      # in a helper
      def something_to_show?
        [ @arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]
        ].any?(&:present?)
      end
      
      # in the view
      <% if something_to_show? %>
        <h1>Hello World</h1>
      <% else %>
        <h1>Boo</h1>
      <% end %>
      

      【讨论】:

        【解决方案4】:

        一种不需要 Rails 的简单方法:

        puts [a, b, c].map(&:to_a).all?(&:empty?) ? 'Boo' : 'Hello World'
        

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 2011-07-22
          • 2021-06-01
          • 2011-02-16
          • 2011-04-24
          • 2013-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多