Ruby on rails 将数据从“datetime_select”转换为datetime对象的Rails方法在哪里?

Ruby on rails 将数据从“datetime_select”转换为datetime对象的Rails方法在哪里?,ruby-on-rails,ruby,Ruby On Rails,Ruby,当我在表单中使用时,它会生成如下HTML: <select id="some_date_1i" name="somedate1(1i)"> #year <select id="some_date_2i" name="somedate1(2i)"> #month <select id="some_date_3i" name="somedate1(3i)"> #day <select id="some_date_4i" name="somedate1(

当我在表单中使用
时,它会生成如下HTML:

<select id="some_date_1i" name="somedate1(1i)">  #year
<select id="some_date_2i" name="somedate1(2i)">  #month
<select id="some_date_3i" name="somedate1(3i)">  #day
<select id="some_date_4i" name="somedate1(4i)">  #hour
<select id="some_date_5i" name="somedate1(5i)">  #minute
如何将其转换为DateTime对象

我可以编写自己的方法来实现这一点,但由于Rails已经能够进行转换,我想知道是否可以调用Rails方法来实现这一点

我不知道在哪里可以找到那种方法


我最终试图解决“”,而这个问题是试图找到另一个问题的解决方案的第一步。

保存模型时,此转换在ActiveRecord中发生

你可以用这样的方法来解决这个问题:

somedate = DateTime.new(params["date1(1i)"].to_i, 
                        params["date1(2i)"].to_i,
                        params["date1(3i)"].to_i,
                        params["date1(4i)"].to_i,
                        params["date1(5i)"].to_i)

DateTime::new
DateTime::civil
()

的别名该代码路径的起点似乎就在这里:


这很难找到!我希望这有助于您找到所需的内容

您好,我在ApplicationController上添加了以下内容,它完成了此转换

    #extract a datetime object from params, useful for receiving datetime_select attributes
    #out of any activemodel
    def parse_datetime_params params, label, utc_or_local = :local
      begin
        year   = params[(label.to_s + '(1i)').to_sym].to_i
        month  = params[(label.to_s + '(2i)').to_sym].to_i
        mday   = params[(label.to_s + '(3i)').to_sym].to_i
        hour   = (params[(label.to_s + '(4i)').to_sym] || 0).to_i
        minute = (params[(label.to_s + '(5i)').to_sym] || 0).to_i
        second = (params[(label.to_s + '(6i)').to_sym] || 0).to_i

        return DateTime.civil_from_format(utc_or_local,year,month,mday,hour,minute,second)
      rescue => e
        return nil
      end
    end

这里还有人提供了使用DateTime.new的解决方案,但这在Postgresql中不起作用。这将按原样保存记录,即按插入表单的方式保存记录,因此,如果您使用的是“无时区的时间戳”,它将不会在数据库中保存为utc时间。我花了几个小时试图弄明白这一点,解决办法是使用Time.new而不是DateTime.new:

datetime = Time.new(params["fuel_date(1i)"].to_i, params["fuel_date(2i)"].to_i, 
                        params["fuel_date(3i)"].to_i, params["fuel_date(4i)"].to_i,
                        params["fuel_date(5i)"].to_i)

我对Rails 4有这个问题。结果我忘了将允许的参数添加到我的控制器:

def event_params
  params.require(:event).permit(....., :start_time, :end_time,...)
end

不得不做一些非常类似的事情,最后使用了这种方法:

def time_value(hash, field)
  Time.zone.local(*(1..5).map { |i| hash["#{field}(#{i}i)"] })
end

time = time_value(params, 'start_time')

另请参见:

这是我使用的方法-它将删除的键作为新哈希返回

class Hash
   def delete_by_keys(*keys)
     keys.each_with_object({}) { |k, h| h[k] = delete(k) if include? k }
  end
end

注意,该rescue子句中的exp类是StandardError而不是Exception。我会考虑把它改为“E”或“错误”,以避免任何混淆。不幸的是,这引起了UTC时间的问题。postgresql@JohnMerlino这已经很晚了,但是在将时间保存到Postgres之前,您可以使用Ruby将时间转换为UTC(或任何您想要的时区),并在从数据库检索时将其转换回X语言环境。事实上,在UTC中存储和转换客户端是最重要的。当我这样做时,我无法访问我的参数。当我在byebug中键入“params”时,它会显示从post中输入的参数。当我输入“params[“fuel_date(1i)”]时,它会给我“nil”。你知道为什么吗?@camdixon看看你的params hash从表格的帖子里发来的。这将告诉您要使用的确切字符串。在我的例子中,它是fuel_date,因为这是我分配给datetime_select的符号,但在您的例子中,您可能使用了不同的符号。
class Hash
   def delete_by_keys(*keys)
     keys.each_with_object({}) { |k, h| h[k] = delete(k) if include? k }
  end
end