DateTime с MongoDB/Mongoid и Rails 3 Не заполняется
Вот код в моей модели
include Mongoid::Document
include Mongoid::Timestamps
field :message, :type => String
field :send_at, :type => DateTime
Вот код для моей формы, частичный
<%= f.label :send_at %><br />
<%= f.datetime_select :send_at %>
Но дата и время никогда не заселяются.
Я убедился, что Монго и Монгоид тоже актуальны.
Не уверен, если что-то мне не хватает.
[ОБНОВЛЕНИЕ ЗАГРУЗКИ]
Started POST "/notifis" for 127.0.0.1 at Mon Oct 18 05:48:05 -0400 2010
Processing by NotifisController#create as HTML
Parameters: {"commit"=>"Create Notifi",
"authenticity_token"=>"/hrlnvA2Xn5NqGgCkPFAQV254IHPJEvZoLxOYNNUwhc=", "_snowman"=>"☃",
"notifi"=>{"send_at(2i)"=>"10", "is_sent"=>"0", "send_at(3i)"=>"18",
"send_at(4i)"=>"09", "message"=>"erwer", "send_at(5i)"=>"48",
"send_at(1i)"=>"2010"}}
MONGODB noti_development['notifis'].insert([{"send_at(2i)"=>"10", "created_at"=>Mon Oct
18 09:48:05 UTC 2010, "is_sent"=>false, "updated_at"=>Mon Oct 18 09:48:05 UTC 2010,
"_id"=>BSON::ObjectID('4cbc17d5c24d7602bc00002d'), "send_at(3i)"=>"18",
"message"=>"Sample Message", "send_at(4i)"=>"09", "send_at(1i)"=>"2010",
"send_at(5i)"=>"48"}])
Redirected to http://localhost:3000/notifis
Completed 302 Found in 4ms
Started GET "/notifis" for 127.0.0.1 at Mon Oct 18 05:48:05 -0400 2010
Processing by NotifisController#index as HTML
MONGODB
noti_development['users'].find({:_id=>BSON::ObjectID('4cb9db18c24d7602bc000007')},
{}).limit(-1)
MONGODB noti_development['notifis'].find({}, {})
Rendered notifis/index.html.erb within layouts/application (42.0ms)
Completed 200 OK in 52ms (Views: 51.2ms)
Ответы
Ответ 1
Mongoid не обрабатывает многопараметрические атрибуты, например Date, поэтому вам нужно сделать следующее:
# copied from: https://gist.github.com/315227
# add this to a new file in your lib directory
module MultiParameterAttributes
def filter_time(attributes, name)
attrs = attributes.collect do |key, value|
if key =~ /^#{Regexp.escape(name.to_s)}\((\d+)(\w)\)$/
[$1.to_i, value.send("to_#$2")]
end
end.compact.sort_by(&:first).map(&:last)
Time.zone.local(*attrs) unless attrs.empty?
end
end
# include the module above in your application_controller.rb
class ApplicationController < ActionController::Base
include MultiParameterAttributes
end
# and in the controller action where you process the form params, use filter_time
class YourController < ApplicationController
def your_action
time = filter_time(params, :my_time_attribute_name)
end
end
Дополнительная информация здесь:
http://groups.google.com/group/mongoid/browse_thread/thread/f83cbdd641581912
Ответ 2
Последние версии Mongoid do обрабатывают многопараметрические атрибуты, вам просто нужно включить модуль в свою модель:
include Mongoid::MultiParameterAttributes
Документы: http://mongoid.org/en/mongoid/docs/rails.html