<<
整数と一緒に使用しないでください。ドキュメントを参照してください:
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.