如何从Rails中的date_select或select_date获取日期?

at.*_*at. 27 ruby ruby-on-rails params ruby-on-rails-3 ruby-on-rails-3.2

使用select_date给我回params[:my_date]year,monthday属性.如何轻松获取Date对象?我希望有类似的东西params[:my_date].to_date.

我也乐意使用date_select它.

joo*_*fsh 47

使用date_select分别为日,月和年提供3个单独的键/值对.因此,您可以将它们Date.new作为参数传递给创建新的Date对象.

示例date_select为Event模型返回了params :

"event"=>
 {"name"=>"Birthday",
  "date(1i)"=>"2012",
  "date(2i)"=>"11",
  "date(3i)"=>"28"},
Run Code Online (Sandbox Code Playgroud)

然后创建新Date对象:

event = params[:event]
date = Date.new event["date(1i)"].to_i, event["date(2i)"].to_i, event["date(3i)"].to_i
Run Code Online (Sandbox Code Playgroud)

您可以决定将此逻辑包装在一个方法中:

def flatten_date_array hash
  %w(1 2 3).map { |e| hash["date(#{e}i)"].to_i }
end
Run Code Online (Sandbox Code Playgroud)

然后将其称为date = Date.new *flatten_date_array params[:event].但这不是真正属于控制器的逻辑,因此您可能决定将其移动到其他位置.你甚至可以将它扩展到Date类中,并将其称为date = Date.new_from_hash params[:event].

  • 非常令人惊讶的是Rails不包含简单的转换机制,因为在将日期选择附加到模型时它们已经具有隐藏机制.我在Rails指南文档中发现他们建议使用`Date.civil`,它和`Date.new`有什么区别? (11认同)

Vas*_*lis 13

这是另一个:

# view
<%= date_select('event', 'date') %>

# controller
date = Date.civil(*params[:event].sort.map(&:last).map(&:to_i))
Run Code Online (Sandbox Code Playgroud)

发现于http://kevinlochner.com/use-rails-dateselect-without-an-activerecord


Rya*_*Lue 5

我采用下面的方法,有以下好处:

  1. 它不必xxx(1i)通过显式命名参数键xxx(3i)(因此可以通过更改为来修改以捕获小时和分钟DateDateTime;和
  2. params即使这些参数填充有许多其他键值对,它也会从一组中提取日期。

params是格式的哈希值{ xxx(1i): '2017', xxx(2i): 12, xxx(3i): 31, ... };是目标日期参数的date_key公共子串。xxx

def date_from_params(params, date_key)
  date_keys = params.keys.select { |k| k.to_s.match?(date_key.to_s) }.sort
  date_array = params.values_at(*date_keys).map(&:to_i)
  Date.civil(*date_array)
end
Run Code Online (Sandbox Code Playgroud)

我选择将其作为 的类方法ApplicationRecord,而不是作为 的实例辅助方法ApplicationController。我的推理是,ActiveRecord 实例化器( Model.new)中存在类似的逻辑来解析从 Rails 表单传入的日期。