私にとって、これは解決するためにコントローラの問題のように思える助けにはならないと正常に動作します私の解決策はコントローラがparams
ハッシュを変更して、モデルがビューの変更を認識しないようにすることです。これはプライベートAPIと考えられるbehavior in ActiveRecordに依存しますが、だから...公正な警告:-)
あなたはこのモデルを持っていると言っています:
# app/models/example.rb
class Example < ActiveRecord::Base
attr_accessible :started_at # this is a DateTime
end
(ブートストラップ日付ピッカーによって強化されます)日付部分の通常text_field_tag
を使用するようにビューを調整し、Railsののtime_select
時間部分のため:私たちは以来try
を使用している
# app/views/examples/_form.html.erb
<%= form_for(@example) do |f| %>
<p>
<%= f.label :started_at %>
<%= text_field_tag :started_at, @example.started_at.try(:to_date) %>
<%= f.time_select :started_at, :ignore_date => true %>
</p>
<p><%= f.submit %></p>
<% end %>
お知らせこのフォームは新しいとの永続レコード用にレンダリングされます。これにより、started_at
属性がnil
の場合の問題が回避されます。
class ExamplesController < ApplicationController
before_filter :fix_params, :only => [:create, :update]
# ...
private
def fix_params
date = Date.parse(params.delete(:started_at))
params[:example].merge!({
'started_at(1i)' => date.year.to_s,
'started_at(2i)' => date.month.to_s,
'started_at(3i)' => date.day.to_s
})
end
end
は基本的に、我々は日付としてparams[:started_at]
を解析し、params[:example]
の正しいキーに割り当てている:
そして、それがモデルに送られる前にparams
ハッシュを修正するために、コントローラにbefore_filter
を作成。その後、パラメータが最終的にモデルに渡されると、ActiveRecordはモデルのstarted_at
属性を正しく割り当てます。
いくつかのエラーチェックと検証が必要ですが、これはうまくいくはずです。
"fix_params"の最初の行はparams [:example]を持つ必要があります。それ以外の場合はnilになります。 –
これは事実ではありません。 'f.text_field'の代わりに' text_field_tag'を使っているので、テキストフィールドの名前は 'example [started_at]'ではなく 'started_at'です。だから、 'params'ハッシュのトップレベルで生きています。 – Brandan
ああ、私はそれをスキップしました。私はf.text_fieldでこのように実装しましたが、うまくいきます。 –