christen. Dit is een bug in Rails die de database controleert om het type af te leiden dat nodig is voor de multiparameterattributen. Mijn gok is dat uw "date_time"-kenmerk niet is gekoppeld aan een tijdkolom in uw database.
Ik heb onlangs dit probleem aangepakt waarbij ik een niet-databasekenmerk wilde om multiparameterattributen te accepteren, dit was de beste oplossing die ik kon bedenken:
Ik merkte dat ik een attr_accessor
. wilde instellen om een datum aan mijn model door te geven in een form_for
tag met de f.datetime_select
helper. Dus dit is wat ik had:
Model:
attr_accessor :my_time
Bekijk:
<%= f.datetime_select :my_time %>
Helaas krijg ik dit als ik mijn formulier verzend:
1 error(s) on assignment of multiparameter attributes
Welnu, het blijkt dat dit eigenlijk een Rails-bug is waarvoor een ticket is ingediend. Hoe zorgen we er in de tussentijd voor dat dit werkt? De enige oplossing die ik kon vinden die op afstand aantrekkelijk was, was om gebruik te maken van composed_of
als vervanging voor attr_accessor
. dus...
Model:
composed_of :my_time,
:class_name => 'Time',
:mapping => %w(Time to_s),
:constructor => Proc.new{ |item| item },
:converter => Proc.new{ |item| item }
Ik weet bijna niets over de composed_of
methode, dus je zou er waarschijnlijk je eigen lezing over moeten doen, maar wat ik wel weet is dat het zowel een lezer als een schrijver creëert voor de gegeven instantievariabele, en wat nog belangrijker is, de setter accepteert multiparameterattributen. Hoe ik de opties heb gekozen:
class_name:de naam van onze verwachte klasse. In dit geval Time
mapping:het eerste argument is de klasse en het tweede argument lijkt te werken met elke methode waarop een instantie van de klasse reageert. Ik koos to_s
constructor:Ik weet niet precies hoe dit zou moeten werken. Lijkt te worden gebeld wanneer @my_time
is nil
.
converter:Ik weet niet precies hoe dit zou moeten werken. Lijkt te worden genoemd when from my_time=, maar lijkt niet te worden toegepast met massale toewijzing. Een probleem dat ik tegenkwam met deze oplossing was dat tijden werden ingesteld in UTC in plaats van in de tijdzone van de omgeving. Dus helaas kunnen we my_time niet rechtstreeks gebruiken, maar moeten het in plaats daarvan converteren naar de juiste tijdzone:
Time.zone.parse(my_time.to_s(:number))