Chrześcijanin. Jest to błąd w Railsach, który sprawdza bazę danych w celu wywnioskowania typu potrzebnego dla atrybutów wieloparametrowych. Domyślam się, że Twój atrybut „data_godzina” nie jest powiązany z kolumną czasu w Twojej bazie danych.
Niedawno rozwiązałem ten problem, w którym chciałem, aby atrybut niebędący bazą danych był akceptowany atrybutami wieloparametrowymi, było to najlepsze rozwiązanie, jakie mogłem wymyślić:
Zorientowałem się, że chcę ustawić attr_accessor
do obsługi przekazywania daty do mojego modelu w form_for
tag z f.datetime_select
pomocnik. Oto co miałem:
Model:
attr_accessor :my_time
Widok:
<%= f.datetime_select :my_time %>
Niestety, kiedy przesyłam formularz, otrzymuję to:
1 error(s) on assignment of multiparameter attributes
Okazuje się, że jest to w rzeczywistości błąd Railsowy, na który zgłoszono zgłoszenie. W międzyczasie jak to działa? Jedynym rozwiązaniem, które udało mi się znaleźć, które było zdalnie atrakcyjne, było skorzystanie z composed_of
jako zamiennik dla attr_accessor
. więc...
Model:
composed_of :my_time,
:class_name => 'Time',
:mapping => %w(Time to_s),
:constructor => Proc.new{ |item| item },
:converter => Proc.new{ |item| item }
Prawie nic nie wiem o composed_of
metody, więc prawdopodobnie powinieneś zrobić na niej własny odczyt, ale wiem, że tworzy ona zarówno czytnik, jak i zapis dla danej zmiennej instancji, a co ważniejsze, ustawiacz akceptuje atrybuty wieloparametrowe. Jak wybrałem opcje:
class_name:nazwa naszej oczekiwanej klasy. W tym przypadku Time
mapowanie:pierwszym argumentem jest klasa, a drugi argument wydaje się działać z każdą metodą, na którą odpowiada instancja klasy. Wybrałem to_s
konstruktor:Nie jestem do końca pewien, jak to ma działać. Wygląda na to, że jest wywoływany, gdy @my_time
jest nil
.
konwerter:Nie jestem pewien, jak to ma działać. Wydaje się, że wywoływana jest kiedy from my_time=, ale nie wydaje się być stosowana z przypisaniem masowym. Jednym z problemów, na który natknąłem się z tym rozwiązaniem, było to, że czasy były ustawiane w UTC zamiast w strefie czasowej środowiska. Dlatego niestety nie możemy użyć my_time bezpośrednio, ale zamiast tego musimy przekonwertować go na właściwą strefę czasową:
Time.zone.parse(my_time.to_s(:number))