0

對於使用模塊來說很新穎。我無法讓我的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 

DB/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' 

我在做什麼錯?

回答

1

這裏有幾個問題。您正在對字符串調用floatify_race,但字符串類沒有這種方法,因爲floatify_race僅針對您正在擴展的類定義。有幾個方法,你可以解決這個問題,但一個方法是將剛剛goal_time字符串作爲參數傳遞給floatify_race這樣的:

self.goal_time = floatify_race(self.goal_time)

更重要的是,如果goal_time的數據類型是最後一個浮動在數據庫中,首先將其設置爲字符串,然後在保存之前將其轉換,這有點奇怪。我不知道你的應用程序的細節,但也許你想在用戶輸入一個字符串後,將字符串轉換爲控制器級別的浮點數。

相關問題