Kristen. Ini adalah bug di Rails yang memeriksa database untuk menyimpulkan jenis yang diperlukan untuk atribut multiparameter. Dugaan saya adalah bahwa atribut "date_time" Anda tidak terkait dengan kolom waktu di database Anda.
Saya baru-baru ini mengatasi masalah ini di mana saya ingin atribut non-database ke atribut multiparameter yang diterima, ini adalah solusi terbaik yang bisa saya buat:
Saya mendapati diri saya ingin menetapkan attr_accessor
untuk menangani pemberian tanggal ke model saya dalam form_for
tag dengan f.datetime_select
pembantu. Jadi ini yang saya punya:
Model:
attr_accessor :my_time
Lihat:
<%= f.datetime_select :my_time %>
Sayangnya ketika saya mengirimkan formulir saya, saya mendapatkan ini:
1 error(s) on assignment of multiparameter attributes
Nah ternyata ini sebenarnya bug Rails yang tiketnya sudah dikirimkan. Sementara itu bagaimana kita membuat ini bekerja? Satu-satunya solusi yang dapat saya temukan yang menarik dari jarak jauh adalah dengan menggunakan composed_of
sebagai pengganti attr_accessor
. jadi...
Model:
composed_of :my_time,
:class_name => 'Time',
:mapping => %w(Time to_s),
:constructor => Proc.new{ |item| item },
:converter => Proc.new{ |item| item }
Saya hampir tidak tahu apa-apa tentang composed_of
jadi Anda mungkin harus membaca sendiri tentangnya, tetapi yang saya tahu adalah bahwa itu menciptakan pembaca dan penulis untuk variabel instan yang diberikan, dan yang lebih penting, penyetel menerima atribut multiparameter. Bagaimana saya memilih opsi:
class_name:nama kelas yang diharapkan. Dalam hal ini, Time
mapping:argumen pertama adalah kelas dan argumen kedua tampaknya bekerja dengan metode apa pun yang ditanggapi oleh instance kelas. Saya memilih to_s
konstruktor:Tidak begitu yakin bagaimana ini seharusnya bekerja. Tampaknya dipanggil ketika @my_time
adalah nil
.
converter:Tidak begitu yakin bagaimana ini seharusnya bekerja. Tampaknya dipanggil ketika dari my_time=, tetapi tampaknya tidak diterapkan dengan penugasan massal. Satu masalah yang saya hadapi dengan solusi ini adalah waktu diatur dalam UTC alih-alih zona waktu lingkungan. Jadi sayangnya kami tidak dapat menggunakan my_time secara langsung, tetapi harus mengubahnya ke zona waktu yang tepat:
Time.zone.parse(my_time.to_s(:number))