2

我有一个表单字段,它以“05/14/2013 - 05/22/2013”​​格式发布日期范围。我的模型有两个单独的日期字段,begin分别end用于表单字段的开始日期和结束日期。将日期范围放入正确字段的最佳 MVC 方法是什么?

我一直在尝试手动解构控制器create方法中的日期范围,但在创建记录之前,模型中似乎没有正确看到更新的参数。

编辑:日期范围以这种格式出现,因为我使用的是 Keith Wood 的 datepick,它在单个输入字段中输出日期。

我目前一直在尝试做的是(contract是我的模型的名称,并且dates是输入日期范围:
beginDate = params[:dates].split("-")[0].strip()
endDate = params[:dates].split("-")[1].strip()
params.delete :dates
params[:contract][:begin] = Date.strptime(beginDate, '%m/%d/%Y')
params[:contract][:end] = Date.strptime(endDate, '%m/%d/%Y')
@contract = Contract.new(params[:contract])

...但是这些对参数的更改不会在创建和验证记录时出现。

4

2 回答 2

5

在您的模型上定义一个设置器,它获取字段,拆分它,并将每个部分放入适当的字段中。

def date_range=(val)
  begin_str, end_str = val.split(' - ')
  self.begin_at = Date.parse(begin_str)
  self.end_at = Date.parse(end_str)
end

这将在直接调用或从质量分配方法(例如update_attributesor )调用时起作用create。如果您已经在模型中定义了这个,请确保添加date_range(或相关的参数名称) 。attr_accessible

我已经更改了示例中的字段名称,begin并且end应该避免作为字段名称,因为一个是方法,另一个是 ruby​​ 语法的一部分。

于 2013-04-05T16:21:29.160 回答
1

您可以使用虚拟属性将日期范围文本转换为模型级别的单个日期。在模型中添加如下的 setter 和 getter,

def date_range_text
   return "#{start_date.to_s} - #{end_date.to_s}"
end
def date_range_text= val
  start_date_text,end_date_text = val.split[" - "]
  start_date = Time.zone.parse(start_date_text) unless start_date_text.nil?
  end_date = Time.zone.parse(end_date_text) unless end_date_text.nil?
end

并在您的表单中使用 data_range_text。有关我的信息,请查看下面的 railscast。

http://railscasts.com/episodes/16-virtual-attributes-revised

这是处理数据库结构和用户输入表单之间差异的最佳方式。

于 2013-04-05T16:28:31.653 回答