我相信, datetime_select
是黑魔法。 我真正想弄清楚是整个1i
, 2i
, 3i
, 4i
......多个参数的东西。 具体它是如何在后端处理(ActiveRecord的,别的东西吗?)。 什么是与“我”之后的订单号码是多少? 它是一个类型说明符? 如果是的话有什么其他类型的有哪些? 我读过date_helper.rb的来源,这是相当不透明。
这里是我的动力:
我有一个:datetime
在我的模型栏,我想在通过两个视图输入text_field
S:一个日期和一个时间。 他们需要进行验证,合并到一起,然后存储到datetime列。 最后,我会使用JavaScript日历输入日期,日期字段。
因此,有没有人这样做呢? 我尝试使用虚拟属性(除了基本的railscast难以置信无证)和问题是创建并具有无属性的新ActiveRecord的对象时,虚拟属性失败(未定义的方法strftime
对于零级,这是有道理的)。
任何人有任何建议或最佳做法? 谢谢!
我有同样的问题。 这里是我的发现...
http://apidock.com/rails/ActiveRecord/Base/assign_multiparameter_attributes
assign_multiparameter_attributes(对)私人
实例化的需要不止一个构造函数参数的所有属性类对象。 这是通过调用在柱类型或聚合类型(通过composed_of)对象与这些参数的新完成的。 所以具有对written_on(1)= “2004”,written_on(2)= “6”,written_on(3)= “24”,将实例written_on(日期类型)与Date.new( “2004”,“6 ”, “24”)。 您还可以指定在括号中的类型转换字符有他们在构造函数中使用之前类型强制转换的参数。 使用我的Fixnum对象,F浮法,S代表字符串和数组。 如果给定属性的所有值都为空,则该属性将被设置为零。
所以数字是该列的数据类型的参数。 “我”是将其转换为整数。 其他类型的支持,如“F”为float等
你可以在这里看到execute_callstack_for_multiparameter_attributes它检测到的目标类型和实例它传递的价值观。
因此,直接尝试回答这个问题提出的,我不认为你可以用它来替代日期时间是如何创建的,因为它使用了不支持要在传递的格式构造。我的工作,周围是拆分DateTime列出一个日期和一次列。 那么UI可以工作,我想要的方式。
我不知道是否有可能创造上分别表示的日期和时间类的属性访问器,但保持一个DateTime列。 然后形式可以引用这些单独的访问器。 这可能是可行的。 另一种选择可能是使用composed_of进一步自定义类型。
希望可以帮助别人。 :)
下面是我最终想出。 如果任何人有任何意见,让我知道。 我很想得到反馈。
validate :datetime_format_and_existence_is_valid
before_save :merge_and_set_datetime
# virtual attributes for date and time allow strings
# representing date and time respectively to be sent
# back to the model where they are merged and parsed
# into a datetime object in activerecord
def date
if (self.datetime) then self.datetime.strftime "%Y-%m-%d"
else @date ||= (Time.now + 2.days).strftime "%Y-%m-%d" #default
end
end
def date=(date_string)
@date = date_string.strip
end
def time
if(self.datetime) then self.datetime.strftime "%l:%M %p"
else @time ||= "7:00 PM" #default
end
end
def time=(time_string)
@time = time_string.strip
end
# if parsing of the merged date and time strings is
# unsuccessful, add an error to the queue and fail
# validation with a message
def datetime_format_and_existence_is_valid
errors.add(:date, 'must be in YYYY-MM-DD format') unless
(@date =~ /\d{4}-\d\d-\d\d/) # check the date's format
errors.add(:time, 'must be in HH:MM format') unless # check the time's format
(@time =~ /^((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AaPp][Mm]))$|^(([01]\d|2[0-3])(:[0-5]\d){0,2})$/)
# build the complete date + time string and parse
@datetime_str = @date + " " + @time
errors.add(:datetime, "doesn't exist") if
((DateTime.parse(@datetime_str) rescue ArgumentError) == ArgumentError)
end
# callback method takes constituent strings for date and
# time, joins them and parses them into a datetime, then
# writes this datetime to the object
private
def merge_and_set_datetime
self.datetime = DateTime.parse(@datetime_str) if errors.empty?
end
文章来源: How do ruby on rails multi parameter attributes *really* work (datetime_select)