0

使用模块非常新。在验证它并将其保存到数据库之前,我无法让我的模块方法将用户输入的字符串(“1:48.55”)转换为浮点数。不知道我做错了什么......

配置/应用程序.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

应用程序/模型/事件.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

分贝/种子.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'

我究竟做错了什么?

4

1 回答 1

1

这里有几个问题。您正在调用floatify_race一个字符串,但字符串类没有这样的方法,因为floatify_race它只为您正在扩展的类定义。有几种方法可以解决这个问题,但一种方法是将goal_time字符串作为参数传递给floatify_race这样的:

self.goal_time = floatify_race(self.goal_time)

更重要的是,如果goal_time数据库中的数据类型最终是浮点数,那么先设置成字符串,再转换再保存,就有点奇怪了。我不知道您的应用程序的详细信息,但也许您想在用户输入字符串后将字符串转换为控制器级别的浮点数。

于 2013-04-06T03:42:35.663 回答