キリスト教徒。これは、データベースをチェックしてマルチパラメータ属性に必要なタイプを推測する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
マッピング:最初の引数はクラスであり、2番目の引数はクラスのインスタンスが応答するすべてのメソッドで機能するようです。 to_s
を選択しました コンストラクター:これがどのように機能するのかよくわかりません。 @my_time
のときに呼び出されるようです nil
です 。
コンバーター:これがどのように機能するのかよくわかりません。 my_time =から呼び出されたようですが、一括割り当てには適用されていないようです。このソリューションで遭遇した問題の1つは、環境のタイムゾーンではなくUTCで時刻が設定されていたことです。そのため、残念ながらmy_timeを直接使用することはできませんが、代わりに適切なタイムゾーンに変換する必要があります。
Time.zone.parse(my_time.to_s(:number))