2009-06-10 117 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

相关问题