- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个运行良好的模型:
class Weight < ActiveRecord::Base
belongs_to :user
validates_presence_of :weight, :measured_on
attr_accessible :weight, :measured_on
def after_initialize
self.measured_on ||= Date.today
end
end
我添加了这一行
validates_uniqueness_of :measured_on, :scope => :user_id
它开始在验证时抛出错误。不是验证错误而是 Ruby 错误:
>> w.valid?
ActiveRecord::MissingAttributeError: missing attribute: measured_on
from /Users/pupeno/Projects/sano/app/models/weight.rb:8:in `after_initialize'
我在 after_initialize 中放置了一个调试器语句,并且我注意到了一些意想不到的事情。当我创建一个新权重时,它按预期工作,after_initialize 上的 self 对象是预期的权重:
>> w = Weight.new
/Users/pupeno/Projects/sano/app/models/weight.rb:9
self.measured_on ||= Date.today
(rdb:1) p self
#<Weight id: nil, user_id: nil, weight: nil, measured_on: nil, created_at: nil, updated_at: nil>
(rdb:1) c
=> #<Weight id: nil, user_id: nil, weight: nil, measured_on: "2009-11-22", created_at: nil, updated_at: nil>
当我运行 w.valid?它变得奇怪。 after_initialize 再次被调用,我不确定为什么,并且 self 对象不是我所期望的:
>> w.valid?
/Users/pupeno/Projects/sano/app/models/weight.rb:9
self.measured_on ||= Date.today
(rdb:1) p self
#<Weight id: 1>
(rdb:1) p self.inspect
"#<Weight id: 1>"
(rdb:1) p self.class
Weight(id: integer, user_id: integer, weight: float, measured_on: date, created_at: datetime, updated_at: datetime)
(rdb:1) p self.measured_on
ActiveRecord::MissingAttributeError Exception: missing attribute: measured_on
(rdb:1)
似乎创建了另一个没有任何属性但设置了 id 的 Weight 对象。任何想法为什么?这是错误还是预期的行为?我在 after_initialize 上设置 measured_on 是不是做错了什么?
如果有人遇到同样的问题,我目前的解决方法是
class Weight < ActiveRecord::Base
belongs_to :user
validates_presence_of :weight, :measured_on
validates_uniqueness_of :measured_on, :scope => :user_id
attr_accessible :weight, :measured_on
def after_initialize
if self.has_attribute? :measured_on
self.measured_on ||= Date.today
end
end
end
但我想要一个合适的解决方案。
最佳答案
我认为您遇到了我最近遇到的 Rails 错误。参见 This blog entry链接到相关的灯塔错误。
我的理解是,发生的事情是一些先前的 Rails 代码执行“从表名中选择 ID”以查看条目是否存在或匹配。然后该对象缓存表中存在的唯一字段是“id”。然后您的代码运行,然后“属性”值不正确,仅反射(reflect) id 字段。
据我所知,这只发生在这个特定的代码路径被命中时,并且通常不会扰乱事情,除了在进行验证时。
我为解决这个问题所做的是将 after_initialise 代码包装在 begin/rescue ActiveRecord::MissingAttributeError block 中。然后我在应用程序和每个项目上方写了一个大注释,指示何时发布新版本的 Rails,我们可以删除它。
是的,我相信还有更优雅的解决方案。
def after_initialize
begin
# ... updates here
# self.unique_reference = UUIDTools::UUID.random_create.to_s
rescue ActiveRecord::MissingAttributeError
end
end
或者你也可以这样做:
def after_initialize
if self.has_attribute? :measured_on
self.measured_on ||= Date.today
end
end
关于ruby-on-rails - validates_presence_of 导致 after_initialize 被一个奇怪的 self 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1778374/
我有以下(高度简化的)模型,它使用 will_paginate class Search 1 end end 我的表演 Action 中的 Controller 代码是 @search = Se
每当我的 Rails 4 应用程序在部署后加载时,我想对另一个应用程序进行 REST API 调用,告诉它我的应用程序已准备就绪并开始一些测试。 我最初打算在 initialzers 文件夹中执行此操
inverse_of 似乎在 after_initialize 回调中不起作用 class User :user end class Face :faces after_initialize
更新 我错误地检查了edgerails指南,而不是当前正确的Rails 3指南(其中没有提到after_initialize)。不知道为什么edgerails指南是“不正确的”,但我认为edgerai
为 after_find 和 after_initialize 事件定义回调的唯一方法是将它们定义为方法。如果您尝试使用第二种技术将它们声明为处理程序,它们将被默默忽略。 谁能解释为什么会这样? 为什
我正在使用 FactoryGirl 和 Rspec 进行测试。 如果 init 为 nil,模型会在 init 之后设置一个外键。因此它使用另一个关联的数据。但是我该如何测试呢? 通常我会使用一个工厂
我有以下2个型号 class Sport :productable accepts_nested_attributes_for :product, :allow_destroy => true
我有两个具有一对多关联的模型。我想在初始化时根据父模型的某些状态在子模型上设置默认值。这涉及到在需要通过belongs_to关联访问父级的子级上触发after_initialize回调。问题是,当我使
我有一个这样定义的 Family 类: class Family true validates :name, :presence => true,
我有一个名为 Purchase 的模型,其中包含一个名为 tickets 和 amount 的字段。这个模型属于Event,是有价格的。我想在创建新 Purchase 后调用 update_amoun
我已经为我的项目编写了一个扩展 ActiveRecord 模型行为的方法,我已经删除了其中的大部分内容,请考虑以下代码: class ActiveRecord::Base def self.has
我有一个运行良好的模型: class Weight :user_id 它开始在验证时抛出错误。不是验证错误而是 Ruby 错误: >> w.valid? ActiveRecord::MissingA
我的 Rails 应用程序有许多形成层次结构的模型。例如:零售商 > 部门 > 产品类别 > 产品 > 评论。 业务需求是高权限用户可以与新的或现有的“普通”用户“共享”层次结构中的任何单个元素。如果
我定义了一个 after_initialize和一个 after_find在我的 User 中回调这样的模型: 请假设我的 User有一个名为 email 的属性也是。 class User Use
我正在尝试使用 after_initialize 为对象设置一些默认值。我遇到的问题是,无论如何创建对象,我都希望调用它。 我的类(class): class Foo "things")和Foo.c
型号: class Project :comments end class Post < AR::Base has_many :comments belongs_to :user end 现在
我是一名优秀的程序员,十分优秀!