Křesťan. Toto je chyba v Rails, která kontroluje databázi, aby odvodila typ potřebný pro multiparametrové atributy. Odhaduji, že váš atribut „date_time“ není spojen se sloupcem času ve vaší databázi.
Nedávno jsem se vypořádal s tímto problémem, kde jsem chtěl atribut, který není v databázi, k akceptovaným multiparametrovým atributům, toto bylo nejlepší řešení, se kterým jsem mohl přijít:
Zjistil jsem, že chci nastavit attr_accessor
pro zpracování předání data mému modelu ve form_for
tag s f.datetime_select
pomocník. Takže tohle jsem měl:
Model:
attr_accessor :my_time
Zobrazit:
<%= f.datetime_select :my_time %>
Bohužel při odeslání formuláře se mi zobrazí toto:
1 error(s) on assignment of multiparameter attributes
Ukazuje se, že se ve skutečnosti jedná o chybu Rails, na kterou byl podán tiket. Jak to mezitím zajistíme? Jediné řešení, které bylo vzdáleně atraktivní, bylo použití composed_of
jako náhrada za attr_accessor
. takže...
Model:
composed_of :my_time,
:class_name => 'Time',
:mapping => %w(Time to_s),
:constructor => Proc.new{ |item| item },
:converter => Proc.new{ |item| item }
O composed_of
nevím téměř nic metodu, takže byste si na ní pravděpodobně měli udělat vlastní čtení, ale vím, že pro danou instanční proměnnou vytvoří čtečku i zapisovač a co je důležitější, setter přijímá multiparametrické atributy. Jak jsem vybíral možnosti:
class_name:název naší očekávané třídy. V tomto případě Time
mapování:prvním argumentem je třída a zdá se, že druhý argument funguje s jakoukoli metodou, na kterou instance třídy odpovídá. Vybral jsem to_s
konstruktor:Nejsem si jistý, jak by to mělo fungovat. Zdá se, že je voláno, když @my_time
je nil
.
konvertor:Nejsem si jistý, jak to má fungovat. Zdá se, že je voláno když z my_time=, ale nezdá se, že by bylo použito s hromadným přiřazením. Jedním z problémů, na který jsem s tímto řešením narazil, bylo, že se časy nastavovaly v UTC místo v časovém pásmu prostředí. Takže bohužel nemůžeme použít my_time přímo, ale místo toho jej musíme převést na správné časové pásmo:
Time.zone.parse(my_time.to_s(:number))