attr_accessor使用select_date来表示日期和问题

时间:2011-02-11 16:29:32

标签: ruby-on-rails ruby-on-rails-3 date attr-accessor

我正在尝试使用attr_accessor获取通常正常工作的日期,除非我尝试将其与select_date辅助方法一起使用。

查看帮助器方法背后的代码我猜它会查找具有日期类型的表列。在这种情况下,由于没有表,它没有正确处理它,我得到:

的ActiveRecord :: MultiparameterAssignmentErrors

"search"=>{"number_of_days"=>"3",
 "searchable_id"=>"6933",
 "startdate(1i)"=>"2011",
 "startdate(2i)"=>"2",
 "startdate(3i)"=>"11"}}

有解决方法吗?或者我是否需要在控制器中创建某种过滤器?我更喜欢在模型级别上做,但我不知道如何处理这种情况?每个人的attr_accessor似乎有点过分杀人。其他人有一个优雅的解决方案吗?

4 个答案:

答案 0 :(得分:3)

保存/更新模型时,通常不会保存

attr_accessor字段。你是如何更新模型的?

此外,您可以将startdate参数转换为日期对象,如下所示:

@start_date = Date.civil(params[:search][:"startdate(1i)"].to_i,params[:search][:"startdate(2i)"].to_i,params[:search][:"startdate(3i)"].to_i)

Check here

答案 1 :(得分:1)

迟到,但万一其他人绊倒了,现代导轨的答案在于您模型中的 include ActiveRecord::AttributeAssignment

This answer 为我做的。

答案 2 :(得分:0)

select_date用于构建与模型字段无关的下拉列表(您可以在另一侧获取它们,然后使用它们执行您想要的操作)。我假设你的意思是date_select,这会影响模型吗?

在任何情况下,据我所知,长话短说,没有好的和漂亮的方式让这个工作。这不是因为帮助程序的工作方式,而是因为活动记录处理这些属性的方式分为多个参数。

如果你感兴趣,可以更详细一点,这就是因为当Active Record处理你传入的params时,它会通过execute_callstack_for_multiparameter_attributes来解释已被拆分为“date(1i)”样式的键,并将它们粘贴到它们应该是的适用类(日期或时间对象)中。它是否应该创建日期或时间的方法是通过检查属性的类型(see here),但由于你的'startdate'属性没有绑定到特定类型,它不会不会被视为数据库中的日期或日期时间列。

我想我会像@ Phyo-Wai-Win一样处理它,但是使用select_date在'search'命名空间之外设置一个不同的参数,然后你可以根据需要将其传递给模型控制器。这样,它就没有多大工作,这意味着你不会弄乱你初始化记录的方式或它预期的属性。

答案 3 :(得分:0)

我在这里有点晚了,但我刚遇到这个问题并且不喜欢最好的答案。我在ActiveRecord源中找到了一个名为 extract_callstack_for_multiparameter_attributes 的方法(这与idlefingers提到的方法不同)

我的模型中有以下方法。我手动调用此方法但您可以覆盖update_attributes以便在从控制器保存时自动运行它。 params参数实际上是来自控制器的params [:my_model]。

attr_accessor :submit_from, :submit_to

def set_dates(params)
  dates = extract_callstack_for_multiparameter_attributes(params)

  dates.each_pair do |field, date_array|
    send "#{field}=", Date.new(*date_array)
  end
end