【问题标题】:DateTime with MongoDB/Mongoid and Rails 3 Not Populating没有填充 MongoDB/Mongoid 和 Rails 3 的 DateTime
【发布时间】:2010-10-18 09:54:50
【问题描述】:

这是我模型中的代码

 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 %>

但是从不填充日期和时间。 我确保 Mongo 和 Mongoid 也是最新的。 不知道我是否遗漏了什么。

[更新日志条目]

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)

【问题讨论】:

  • 请添加一些日志行,以便我们可以查看这些值是否正确提供给控制器。

标签: ruby ruby-on-rails-3 mongodb mongoid


【解决方案1】:

最新版本的 Mongoid 处理多参数属性,您只需在模型中包含模块:

include Mongoid::MultiParameterAttributes

文档:http://mongoid.org/en/mongoid/docs/rails.html

【讨论】:

  • 谢谢加布。这正是我所需要的
  • 这也有助于使用 simple_form 的日期时间
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2015-12-22
    • 2019-11-24
    相关资源
    最近更新 更多