2009-06-10 68 views
4

我正在嘗試使用time_select將時間輸入到將執行一些計算的模型中。Rails,在非活動記錄模型上使用time_select

time_select幫助程序準備返回的參數,以便它可用於對Active Record對象的多參數分配。

像下面

Parameters: {"commit"=>"Calculate", "authenticity_token"=>"eQ/wixLHfrboPd/Ol5IkhQ4lENpt9vc4j0PcIw0Iy/M=", "calculator"=>{"time(2i)"=>"6", "time(3i)"=>"10", "time(4i)"=>"17", "time(5i)"=>"15", "time(1i)"=>"2009"}} 

我的問題是,什麼是處於非活動記錄模式,使用這種格式的最佳方式。另請注意。 (5i),(4i)等的含義是什麼? (除了顯而易見的原因來區分不同的時間值,基本上它爲什麼被這樣命名)

謝謝

回答

4

您可以在非活動記錄模型創建方法如下

# This will return a Time object from provided hash 
def parse_calculator_time(hash) 
    Time.parse("#{hash['time1i']}-#{hash['time2i']}-#{hash['time3i']} #{hash['time4i']}:#{hash['time5i']}") 
end 

然後,您可以撥打從控制器的動作方法如下

time_object = YourModel.parse_calculator_time(params[:calculator]) 

它可能不是最好的解決方案,但它使用起來很簡單。

Cheers :)

2

字母數字表示你希望它被丟在類型之後。在這種情況下,integer。它也可以是f,對於floats對於string

我只是自己做了這個,我能找到的最簡單的方法是基本上將Rails代碼複製/粘貼到我的基本模塊(或抽象對象)中。

我從ActiveRecord::Base

  • assign_multiparameter_attributes(pairs)
  • extract_callstack_for_multiparameter_attributes(pairs)
  • type_cast_attribute_value(multiparameter_name, value)
  • find_parameter_position(multiparameter_name)

逐字複製下面的功能我也有致電/以下方法使用它們:

def setup_parameters(params = {}) 
    new_params = {} 
    multi_parameter_attributes = [] 

    params.each do |k,v| 
    if k.to_s.include?("(") 
     multi_parameter_attributes << [ k.to_s, v ] 
    else 
     new_params[k.to_s] = v 
    end 
    end 

    new_params.merge(assign_multiparameter_attributes(multi_parameter_attributes)) 
end 

# Very simplified version of the ActiveRecord::Base method that handles only dates/times 
def execute_callstack_for_multiparameter_attributes(callstack) 
    attributes = {} 

    callstack.each do |name, values| 

    if values.empty? 
     send(name + '=', nil) 
    else 
     value = case values.size 
     when 2 then t = Time.new; Time.local(t.year, t.month, t.day, values[0], values[min], 0, 0) 
     when 5 then t = Time.time_with_datetime_fallback(:local, *values) 
     when 3 then Date.new(*values) 
     else nil 
     end 

     attributes[name.to_s] = value 
    end 

    end 

    attributes 
end 

如果你找到一個更好的解決方案,請讓我知道:-)

+0

這是Rails 3或4的解決方案嗎?在我嘗試使用Rails 4時,它似乎不起作用。 – 2013-12-13 23:42:12

+0

@MattHuggins這真的可能是Rails 2,所以它很可能不會在Rails 4中工作。 – 2013-12-14 10:41:17

相關問題