0

私はすべてのロジックを視野に入れないように努めており、次のコードを考え出しましたが、実際のスコア値を返さないということですが、勝ち、負け、または引き分けの場合は返されます

def find_result(schedule)
return "not required" if schedule.event != '1' or schedule.time >= Time.now
if schedule.for.nil? or schedule.against.nil?
  "Not Entered"
else
  tie = '<b>T</b> '
  tie << schedule.for.to_i
  tie << ' - '
  tie << schedule.against.to_i
  win = '<b>W</b> '
  win << schedule.for.to_i
  win << ' - '
  win << schedule.against.to_i
  return raw tie  if schedule.for.to_i == schedule.against.to_i
  schedule.for.to_i > schedule.against.to_i ? (raw win) : "Lost"
end

終わり

4

1 に答える 1

2

<<整数と一緒に使用しないでください。ドキュメントを参照してください:
http ://www.ruby-doc.org/core-1.9.3/String.html#method-i-3C-3C

おそらく、勝ち負けの数字がHTMLに表示されない文字に変わっているのでしょう。

数字を追加するときto_sではなく、フォーマッターなどを使用します。to_i

文字列形式を使用した例(テストされていない):

def find_result(schedule)
  return "not required" if schedule.event != '1' or schedule.time >= Time.now
  if schedule.for.nil? or schedule.against.nil?
    "Not Entered"
  elsif schedule.for.to_i < schedule.against.to_i
    "Lost"
  else
    raw "<b>%s</b> %d - %d" % [
      schedule.for.to_i == schedule.against.to_i ? 'T' : 'W',
      schedule.against.to_i,
      schedule.for.to_i
    ]
  end

編集:リファクタリング

ロジックをビューから除外することは良いことですが、これの一部をモデルに移動すること、つまりスケジュールの結果(入力されていない、勝つ、負ける、引き分け)がさらに適切です。

この例では、そのロジックをカプセル化する単純な内部クラスを作成します。これは、Scheduleが自身の結果を知るために使用します。ただし、これはさまざまな方法で実行できます(たとえば、モジュールとクラス、またはスケジュールに直接基づいたメソッド)。

次に、提供されたロジックを使用して、または単に結果自体を照会し、それを翻訳ルックアップ(I18n)のキーとして使用して、ヘルパーで新しいスケジュールを使用する方法を示します。

これはテストされておらず、少し疑似コード化されていることに注意してください(特に、メソッドと変換フォーマットを推測するだけで、I18nライブラリを使用していません)。しかし、それはいくつかの調整で機能するか、少なくともあなたに物事を行う別の方法のアイデアを与えるはずです。

class Schedule

  # The schedule jus instantiates a result object when you ask for one.
  # For convenience the result's to_s is it's value, e.g. "win"
  def result
    Result.new(self.for, self.against)
  end

  # delegate methods querying the result
  delegate :win?, :loss?, :tie?, :not_entered?, :to => :result

  class Result
    Values = %(win loss tie not_entered)
    Win = Values[0]
    Loss = Values[1]
    Tie = Values[2]
    NotEntered = Values[3]

    attr_reader :for, :against

    def initialize(_for, against)
      @for = _for
      @against = against
    end

    def value
      return NotEntered unless [@for, @against].all?
      case v = @for - @against
      when v.zero? then Tie
      when v > 0 then Win
      else Loss
      end
    end

    alias :to_s :value

    def not_entered?; self.value == NotEntered end
    def win?; self.value == Win end
    def loss?; self.value == Loss end
    def tie?; self.value == Tie end
  end
end

# then in your helper, something like
def find_result(schedule)
  # you'd want to refactor this requirement part too
  return "not required" if schedule.event != '1' or schedule.time >= Time.now

  # Now you could do it essentially the way you had, with ifs or a 
  # case statement or what have you, but the logic for the result is kept 
  # where it belongs, on the class.
  if schedule.not_entered?
    "Not Entered"
  elsif schedule.loss?
    "Loss"
  else
    prefix = schedule.win? ? "W" : "T"
    raw "<b>%s</b> %d - %d" % [prefix, schedule.for, schedule.against]
  end

  # OR you could use some kind of translation library using the `value` 
  # returned by the result.  Something like:
  key = ["schedule", schedule.outcome.value].join(".")
  raw I18n.translate(key, {:for => schedule.for, :against => schedule.against})
end

# if you used the latter, it would lookup the translation in some other place, 
# e.g. some config JSON, which might look like this (more or less, and 
# depending on the lib you use):

{
  "schedule": {
    "win": "<b>W</b> {{for}} - {{against}}",
    "tie": "<b>T</b> {{for}} - {{against}}",
    "loss": "Loss",
    "not_entered": "Not Entered"
  }
}

# The translation has a few advantages.  It would allow you to sub in other 
# languages, but also, it conveniently keeps all of the app's text in one 
# place, if you stick to using it.
于 2012-08-20T16:04:50.630 に答える