使用模块很新。在验证它并将其保存到数据库之前,我无法使用我的Module方法将用户输入的字符串(“1:48.55”)转换为浮点数。不确定我做错了什么......
config / application.rb
config.autoload_paths += %W(#{config.root}/lib/modules/)
lib / modules / sport_time.rb
module SportTime
extend ActiveSupport::Concern
attr_accessor :goal_time
included do
before_validation :sporty_save
end
def self.stringify_race(secs)
m = (secs/60).floor
s = (secs - (m*60))
sprintf("%02d:%.2f\n",m,s)
end
private
def sporty_save
self.goal_time = self.goal_time.floatify_race(goal_time) ---(line 12)---
end
def floatify_race(str)
dirty = str.split(":")
min = dirty[0]
sec = dirty[1]
seconds = (min.to_i * 60) + sec.to_f
seconds.round(4)
end
end
应用/模型/ event.rb
class Event < ActiveRecord::Base
include SportTime
validates_presence_of :event_type, :race_length, :course, :goal_time, :user_id
attr_accessible :event_type, :race_length, :course, :goal_time, :user_id
belongs_to :user
end
分贝/ seed.rb
Event.create(
:event_type => 'Run',
:race_length => 800,
:course => 'outdoor',
:goal_time => '01:48.55',
:user_id => user_one.id
)
错误:
rake aborted!
undefined method `floatify_race' for "01:48.55":String
/Users/myname/work/projectname/lib/modules/sport_time.rb:12:in `sporty_save'
我做错了什么?
答案 0 :(得分:1)
这里有几个问题。您在字符串上调用floatify_race
但字符串类没有这样的方法,因为floatify_race
仅为您要扩展的类定义。有几种方法可以解决这个问题,但有一种方法是将goal_time
字符串作为参数传递给floatify_race
,如下所示:
self.goal_time = floatify_race(self.goal_time)
更重要的是,如果goal_time
的数据类型最终是数据库中的浮点数,首先将其设置为字符串然后在保存之前转换它有点奇怪。我不知道您的应用程序的细节,但也许您想在用户输入字符串后将字符串转换为控制器级别的浮点数。