ईसाई। यह रेल में एक बग है जो मल्टीपरमीटर विशेषताओं के लिए आवश्यक प्रकार का अनुमान लगाने के लिए डेटाबेस की जांच करता है। मेरा अनुमान है कि आपकी "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
खैर यह पता चला है कि यह वास्तव में एक रेल बग है जिसके लिए टिकट जमा किया गया है। इस बीच हम यह काम कैसे करते हैं? एकमात्र समाधान जो मुझे मिल सकता था, वह था जो दूर से आकर्षक था 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
chose चुना है कंस्ट्रक्टर:वास्तव में यह सुनिश्चित नहीं है कि यह कैसे काम करना चाहिए। ऐसा लगता है जब @my_time
. कहा जाता है है nil
.
कन्वर्टर:वास्तव में यह सुनिश्चित नहीं है कि यह कैसे काम करेगा। ऐसा लगता है कि जब my_time=से बुलाया गया था, लेकिन ऐसा लगता है कि बड़े पैमाने पर असाइनमेंट के साथ लागू नहीं किया जा रहा है। इस समाधान के साथ मुझे एक समस्या यह थी कि समय पर्यावरण के समय क्षेत्र के बजाय यूटीसी में सेट हो रहा था। इसलिए दुर्भाग्य से हम सीधे my_time का उपयोग नहीं कर सकते, बल्कि इसे उचित समय क्षेत्र में बदलने की आवश्यकता है:
Time.zone.parse(my_time.to_s(:number))