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”(字符串)的事件时,它不是被保存为 75.55(浮点数),而是被保存为 1.0(浮点数)......所以无论我在做什么类 mixin 显然不起作用。

我对使用模块很陌生,所以我很难弄清楚为什么我不能理解我在这里做错了。任何帮助表示赞赏,谢谢。

注意:视图的浮点到字符串转换确实有效。

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 放在 Mixin::SportTime 模块中的 models/mixin 目录下

于 2013-03-29T09:57:01.160 回答