私には、これはコントローラーが解決する問題のように思えます。モデルはまだ有効であり、「Rails」の方法で属性を受け取っていれば問題なく動作します。私の解決策には、コントローラーがparams
ハッシュを変更して、モデルがビューの変更を認識しないようにすることが含まれます。これは、プライベート API と見なされる可能性のあるActiveRecord の動作に依存するため、注意が必要です :-)
このモデルがあるとします:
# app/models/example.rb
class Example < ActiveRecord::Base
attr_accessible :started_at # this is a DateTime
end
ビューを調整text_field_tag
して、日付部分 (bootstrap-datepicker によって拡張されます) に法線を使用time_select
し、時間部分にRails のものを使用します。
# 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 %>
このフォームは新規および永続化されたレコードtry
に対してレンダリングされるため、使用していることに注意してください。これにより、属性がの場合の問題が回避されます。started_at
nil
次にbefore_filter
、コントローラーで を作成しparams
て、モデルに送信される前にハッシュを変更します。
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]
。その後、パラメータが最終的にモデルに渡されると、ActiveRecord はモデルのstarted_at
属性を正しく割り当てます。
エラーチェックと検証を行う必要がありますが、これでうまくいくはずです。