Кристиян. Това е грешка в 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
метод, така че вероятно трябва да направите свое собствено четене върху него, но това, което знам е, че той създава както четец, така и писател за дадена променлива на екземпляр, и което е по-важно, сетерът приема многопараметрични атрибути. Как избрах опциите:
class_name:името на нашия очакван клас. В този случай, Time
картиране:първият аргумент е класът, а вторият аргумент изглежда работи с всеки метод, на който отговаря екземпляр на класа. Избрах to_s
конструктор:Не съм много сигурен как трябва да работи това. Изглежда, че се извиква, когато @my_time
е nil
.
конвертор:Не съм много сигурен как трябва да работи това. Изглежда, че се извиква, когато от my_time=, но не изглежда, че се прилага с масово присвояване. Един проблем, който срещнах с това решение, беше, че времената се задаваха в UTC вместо в часовата зона на средата. Така че за съжаление не можем да използваме my_time директно, а вместо това трябва да го преобразуваме в правилната часова зона:
Time.zone.parse(my_time.to_s(:number))