4

我正在尝试将 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

4 回答 4

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)

在这里检查

于 2011-02-11T17:59:24.903 回答
1

来晚了,但万一其他人偶然发现,现代导轨的答案在于include ActiveRecord::AttributeAssignment您的模型。

这个答案为我做了。

于 2021-03-12T15:32:13.490 回答
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
于 2011-06-04T22:47:25.920 回答
0

select_date用于构建与模型字段无关的下拉列表(您可以在另一侧拿起它们并用它们做您想做的事情)。我假设您的意思是date_select哪个确实脱离了模型?

无论如何,据我所知,长话短说,没有什么好方法可以让它工作。这不是因为助手的工作方式,而是因为活动记录处理这些属性拆分为多个参数的方式。

如果您有兴趣,更详细地说,这不容易工作的原因是因为当 Active Record 处理您传入的参数时,它会通过execute_callstack_for_multiparameter_attributes它来解释已拆分为“ date(1i)" 样式,并将它们转换为它们应该是的适用类(日期或时间对象)。确定是否应该创建日期或时间的方法是根据属性的类型检查它(请参阅此处),但是由于您的“startdate”属性未绑定到特定类型,因此它不会被视为数据库中的日期或日期时间列。

我想我会以与@Phyo-Wai-Win 类似的方式处理它,但用于select_date在“搜索”命名空间之外设置不同的参数,然后在控制器中适当地传递给模型。这样,它的工作量并不大,这意味着您不会弄乱初始化记录的方式或它期望的属性。

于 2011-02-11T20:02:04.913 回答