- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我定义了一个 after_initialize
和一个 after_find
在我的 User
中回调这样的模型:
请假设我的 User
有一个名为 email
的属性也是。
class User < ApplicationRecord
after_initialize do |user|
puts "You have initialized an object! Email: #{email}"
end
after_find do |user|
puts "You have found an object! Email: #{email}"
end
end
按照我在 Rails Guides 中找到的文档.
这按预期工作。 IE。当我调用 User.new
或 User.first
我看到输出按预期打印:
2.3.3 :001 > User.new(email: 'foo@gmail.com')
You have initialized an object! Email: foo@gmail.com
=> #<User id: nil, email: "foo@gmail.com", password_digest: nil,
created_at: nil, updated_at: nil, email_confirmation_token: nil,
terms_of_service: false, country_id: nil>
2.3.3 :002 > User.first
User Load (0.6ms) SELECT "users".* FROM "users" ORDER BY "users"."id"
ASC LIMIT $1 [["LIMIT", 1]]
You have found an object! Email: mary@gmail.com
You have initialized an object! Email: mary@gmail.com
=> #<User id: 10, email: "mary@gmail.com", password_digest:
"$...", created_at: "2017-06-10 06:46:05", updated_at: "2017-07-02
09:52:46", email_confirmation_token: "yStnErkVCFC9mYNHKFNYdA",
terms_of_service: true, country_id: nil>
我的问题是为什么回调文档提到 block 局部变量 user
的存在?从我上面的经历可以看出,user
未使用局部变量,但我仍然可以访问 User
实例实例化和/或找到。
最佳答案
这些没有 record item
的回调(在你的例子中是一个 user
实例)将没有多大意义(如果有的话) - 除了像你的情况这样的测试目的,当你您只是通过调用 puts
确认自己已找到记录,通常,在实际用例中,您可能需要在应用中使用此对象之前读取/修改它。
因此,当您定义回调时,ActiveRecord
将它们存储在内部。 ActiveRecord
假定您将需要此实例,并且在调用您的 block do ... end
时,它会使用找到的记录 (user
) 来完成。理论上(我没有检查 ActiveRecord
代码库中的实际实现)可能看起来像:
record = find_record
if after_find_callback
after_find_callback.call(record)
end
关于ruby-on-rails - 为什么 ActiveRecord after_initialize 和 after_find 回调文档提到 block 级变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45254380/
我有以下(高度简化的)模型,它使用 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 现在
我是一名优秀的程序员,十分优秀!