0

lib/modules/sport_time.rb

module SportTime

    def to_race_time(secs)
      m = (secs/60).floor
      s = (secs - (m*60))
      t = sprintf("%02d:%.2f\n",m,s)
      return t
    end

    def time_to_float(tim)
      dirty = tim.to_s
      min, sec = dirty.split(":")
      seconds = (min.to_i * 60) + sec.to_f
      seconds.round(4)
    end

end

class Event
  extend SportTime
  before_save :sporty_save

  private

  def sporty_save
    self.goal_time = self.class.time_to_float(goal_time)
  end
end

events.rb モデル

class Event < ActiveRecord::Base
   validates_presence_of :course, :goal_time, :race_length, :user_id
   attr_accessible :course, :goal_time, :race_length, :user_id
   belongs_to :user
end

問題:「1:15.55」(文字列) の goal_time でイベントを作成しようとすると、75.55 (float) として保存されるのではなく、1.0 (float) として保存されます。クラスのミックスインは明らかに機能していません。

私はモジュールを扱うのにかなり慣れていないので、なぜうまくいかないのかを理解するのに苦労しています。ここで間違っています。助けていただければ幸いです。

注: ビューの float から string への変換は機能します。

4

1 に答える 1

2
module SportTime
  extend ActiveSupport::Concern

  included do
    before_save :sporty_save
  end

  private
  def sporty_save
    self.goal_time = time_to_float(goal_time)
  end

  def to_race_time(secs)
    m = (secs/60).floor
    s = (secs - (m*60))
    sprintf("%02d:%.2f\n",m,s)
  end

  def time_to_float(tim)
    dirty = tim.to_s
    min, sec = dirty.split(":")
    seconds = (min.to_i * 60) + sec.to_f
    seconds.round(4)
  end

end


class Event < ActiveRecord::Base
   include SportTime
   validates_presence_of :course, :goal_time, :race_length, :user_id
   attr_accessible :course, :goal_time, :race_length, :user_id
   belongs_to :user
end

また、lib ディレクトリが自動ロードされていることを確認するか、Mixin::SportTime モジュールの models/mixin ディレクトリに mixin を配置できます。

于 2013-03-29T09:57:01.160 に答える