Christian. Это ошибка в Rails, которая проверяет базу данных, чтобы определить тип, необходимый для многопараметрических атрибутов. Я предполагаю, что ваш атрибут date_time не связан со столбцом времени в вашей базе данных.
Недавно я решил эту проблему, когда хотел, чтобы атрибут, не относящийся к базе данных, принимал многопараметрические атрибуты, это было лучшее решение, которое я мог придумать:
Я обнаружил, что хочу установить attr_accessor
для обработки передачи даты моей модели в теге form_for
с помощником f.datetime_select
. Итак, вот что у меня было:
Модель:
attr_accessor :my_time
Вид:
<%= f.datetime_select :my_time %>
К сожалению, когда я отправляю свою форму, я получаю это:
1 error(s) on assignment of multiparameter attributes
Что ж, получается, что это на самом деле ошибка 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 }
Я почти ничего не знаю о методе composed_of
, поэтому вам, вероятно, следует выполнить его собственное чтение, но я знаю, что он создает и средство чтения, и средство записи для данной переменной экземпляра, и, что более важно, средство установки принимает многопараметрические атрибуты. Как я выбрал варианты:
имя_класса: имя нашего ожидаемого класса. В этом случае Time
Отображение: первый аргумент является классом, а второй аргумент, похоже, работает с любым методом, на который отвечает экземпляр класса. Я выбрал to_s
Конструктор: Не совсем уверен, как это должно работать. Кажется, вызывается, когда @my_time
равно nil
.
Конвертер: Не совсем уверен, как это должно работать. Кажется, вызывается когда из my_time =, но, кажется, не применяется с массовым назначением.
Одна из проблем, с которой я столкнулся в этом решении, заключалась в том, что время устанавливалось в UTC, а не в часовом поясе среды. Так что, к сожалению, мы не можем использовать my_time напрямую, но вместо этого нужно преобразовать его в соответствующий часовой пояс:
Time.zone.parse(my_time.to_s(:number))