3

Ruby と Rails は初めてです (Python と Python フレームワークから切り替えました)。ハードディスクの SMART 状態に関する情報を表示する簡単なダッシュボード Web サイトを作成しています。ここでは、値が条件を満たしている場合に、関連する SMART 属性の近くのテーブル セルにバッジを表示するヘルパーを作成しました。最初、ヘルパー コードはリスト 1のように単純でしたが、表の個々の SMART 属性の近くにあるバッジに加えて、特定のドライブのすべてのバッジの概要を描画することにしました。最初に、次のような単純なメソッドを追加しました。

def smart_chk_device(attrs)
    attrs.each { |item| smart_chk_attr(item) }
end

しかし、このアプローチは機能せず、結果のページに属性の配列全体が出力されました。リスト 2のように作成して初めて機能し始めましたが、そこには何か問題があると思います。同じことをもっと簡単な方法で行うことができます。正しい Ruby のやり方を教えてください。

リスト 1:

module HomeHelper
    def smart_chk_attr(attr)
        case attr[:id].to_i
        when 1,197
            content_tag(:span, "Warning", :class => "label label-warning") if attr[:raw].to_i > 0
        when 5,7,10,196,198
            content_tag(:span, "Critical", :class => "label label-important") if attr[:raw].to_i > 0
        end
    end
end

リスト 2 (動作しますが、私は好きではありません):

module HomeHelper
    def smart_chk_attr(attr)
        case attr[:id].to_i
        when 1,197
            return content_tag(:span, "Warning", :class => "label label-warning") if attr[:raw].to_i > 0
        when 5,7,10,196,198
            return content_tag(:span, "Critical", :class => "label label-important") if attr[:raw].to_i > 0
        else
            return String.new
        end
        return String.new
    end

    def smart_chk_device(attrs)
        output = ""
        attrs.each { |item| output << smart_chk_attr(item) }
        return output.html_safe
    end
end

attrsはハッシュの配列で、各ハッシュにはキー:id:rawが含まれ、SMART 属性の数値コードとその RAW 値が両方とも文字列で含まれます。

また、RoR は、リスト 2 の最後の「return String.new」を削除する必要があると主張します。なぜそうなるのでしょうか? 「ケース」は考えられるすべてのケースをブロックしないので、制御が関数の最後に到達することはありませんか?

4

2 に答える 2

3

これは同じように動作し、はるかに短いと思います:

module HomeHelper

  def smart_chk_attr(attr)
    return '' unless attr[:raw].to_i > 0
    case attr[:id].to_i
      when 1,197
        content_tag(:span, "Warning", :class => "label label-warning")
      when 5,7,10,196,198
        content_tag(:span, "Critical", :class => "label label-important")
      else ''
    end
  end

  def smart_chk_device(attrs)
    attrs.map { |item| smart_chk_attr(item) }.join.html_safe
  end

end

Ruby メソッドは最後の式の値を返すため、そのメソッド全体で明示的な戻り値を取り除きます。また、DRY: Don't Repeat Yourself (attr[:raw] チェック)。この場合、メソッドの開始時にそれらをガード句に置き換えました。短絡的なガード句は好みの問題ですが、私は好きですし、多くの Ruby コードで見られるでしょう。

于 2012-08-16T21:12:54.507 に答える
0

メソッドsmart_chk_attr(attr)の最後に余分なリターンがあり、決して実行されません。

each列挙子です。指定した各アイテムの処理が完了すると、内部の変更されたものではなく、渡された元のオブジェクトが返されます。

使用collectすると、変更されたオブジェクトを含む配列が取得されます。文字列出力が必要な場合は、joinそれらを文字列に入れるために使用できます。Join は、アイテムを結合する方法のオプションもとります。

def smart_chk_device(attrs)
  attrs.collect{ |item| smart_chk_attr(item) }.join.html_safe
end
于 2012-08-16T21:14:53.287 に答える