datetime_select的多参数错误

Chr*_*ini 9 postgresql ruby-on-rails

我的表单中有以下代码.

<%= f.datetime_select(:date_time, :prompt => {:day => 'Day', :month => 'Month', :year => 'Year'}, :start_year => Date.today.year, :end_year => Date.today.year + 2, :minute_step => 15, :include_blank => false) %> if either one is blank.
Run Code Online (Sandbox Code Playgroud)

当其中一个字段留空时,我得到:

1 error(s) on assignment of multiparameter attributes
Run Code Online (Sandbox Code Playgroud)

正在传递的参数是:

{"utf8"=>"?",
 "authenticity_token"=>"kQpfsj5RxnDtxkvBdwPEFnX1fY6euKnMQeDRAkvJvIE=",
 "event"=>{"description"=>"",
 "venue"=>"",
 "street"=>"",
 "city"=>"",
 "country_id"=>"",
 "date_time(1i)"=>"",
 "date_time(2i)"=>"",
 "date_time(3i)"=>"",
 "date_time(4i)"=>"00",
 "date_time(5i)"=>"00",
 "ticket_url"=>""},
 "x"=>"94",
 "y"=>"12"}
Run Code Online (Sandbox Code Playgroud)

有人知道为什么会这样吗?

在这个链接上似乎有一个"脏"修复,但也许在Rails 3中有一个更好的解决方案?

gab*_*ess 4

基督教。这是 Rails 中的一个错误,它会检查数据库以推断多参数属性所需的类型。我的猜测是您的“date_time”属性与数据库中的时间列没有关联。

我最近解决了这个问题,我想要一个非数据库属性来接受多参数属性,这是我能想到的最佳解决方案:

我发现自己想要设置一个来处理在带有帮助器的标签attr_accessor中将日期传递给我的模型。这就是我所拥有的:form_forf.datetime_select

模型:

attr_accessor :my_time
Run Code Online (Sandbox Code Playgroud)

看法:

<%= f.datetime_select :my_time %>
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我提交表格时,我得到了这个:

1 error(s) on assignment of multiparameter attributes
Run Code Online (Sandbox Code Playgroud)

事实证明,这实际上是一个 Rails 错误,已针对该错误提交了票证。与此同时,我们如何使这项工作发挥作用?我能找到的唯一有吸引力的解决方案是使用composed_of来替代attr_accessor. 所以...

模型:

  composed_of :my_time,
              :class_name => 'Time',
              :mapping => %w(Time to_s),
              :constructor => Proc.new{ |item| item },
              :converter => Proc.new{ |item| item }
Run Code Online (Sandbox Code Playgroud)

我对该方法几乎一无所知composed_of,因此您可能应该自己阅读它,但我所知道的是,它为给定的实例变量创建了读取器和写入器,更重要的是,设置器接受多参数属性。我如何选择选项:

class_name:我们期望的类的名称。在这种情况下,Time
映射:第一个参数是类,第二个参数似乎适用于该类实例响应的任何方法。我选择了to_s 构造函数:不太确定它应该如何工作。似乎是在@my_time什么时候调用的nil
转换器:不太确定这是如何工作的。似乎是从 my_time= 调用的,但似乎不适用于批量分配。我在使用此解决方案时遇到的一个问题是,时间是以 UTC 设置的,而不是环境的时区。因此不幸的是我们不能直接使用 my_time ,而是需要将其转换为正确的时区:

Time.zone.parse(my_time.to_s(:number))
Run Code Online (Sandbox Code Playgroud)

  • 链接的原始解决方案在这里:http://web.archive.org/web/20120121005808/http://gabeodess.heroku.com/posts/14 (4认同)