- 浏览: 2050149 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
先补充一个部分的代码用来说明这些回调在一些实际中的用法,
另这里有个Ruby On Rails验证大全你可能会关心
在看详细回调
通常在一个active record对象的生命周期里,有八个过程
这些stat是可以用来hook
下面是一个
回调的典型例子
有继承关系的回调
下面的情景是说,当在一个类中定义了回调。但,他有一个子类,又定义了一个回调。
然后,我们希望,
有些时候,回调继承执行。就是又要执行父类的回调,又要执行子类的回调。
有些时候,希望子类的回调,重写覆盖父类的回调。
那么,看看如何实现
回调的四种类型
在这其中,前两种是推荐的回调表达方式。块方法的回调有些时候,也比较合适。最后的一种,基本废弃。
回调的参数
回调方法的参数,是记录,根据传入的不同,灵活调用。
method missing的应用
回调的宏,默认下会等待一个符号,但当我们在符号部分,使用method missing时,就可以在预期估值的时候,执行绑定的回调。
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
good
感谢光临,动力啊,
补充完了剩下部分的翻译
class Profile < ActiveRecord::Base before_validation :archive#在验证之前判断, #为什么验证之前呢,因为如果是新建的话就不要验证了 before_destroy :destroy_validate#删除的时候验证 def archive return unless self.new_record? profile = Profile.find_by_name(self.name) unless profile.nil? profile.name = sprintf("a-%s", profile.id) profile.status = true unless profile.save return false end end end def validate#修改默认的验证 errors.add(:major_offset, "must be >= Minor Offset") unless major_offset >= minor_offset errors.add(:minor_offset, "must be <= Major Offset") unless minor_offset <= major_offset if Analyzer.count(:conditions => ["profile_id = ? and status= ?", self.id, Analyzer::INGRESS]) > 0 errors.add_to_base("One or more Analyzers are in Ingress Monitoring mode and use this profile. Edits are disabled until you stop Ingress Monitoring.") return false end end def destroy_validate#对应删除验证的描述 if Analyzer.count(:conditions => ["profile_id = ? ", self.id]) > 0 errors.add_to_base("One or more Analyzers use this profile, Delete are disabled.") return false end if SwitchPort.exists?(:profile_id=> self.id) errors.add_to_base("One or more Analyzers use this profile, Delete are disabled.") return false end end end
另这里有个Ruby On Rails验证大全你可能会关心
在看详细回调
通常在一个active record对象的生命周期里,有八个过程
引用
(-) save
(-) valid?
(1) before_validation
(2) before_validation_on_create
(-) validate
(-) validate_on_create
(3) after_validation
(4) after_validation_on_create
(5) before_save
(6) before_create
(-) create
(7) after_create
(8) after_save
(-) valid?
(1) before_validation
(2) before_validation_on_create
(-) validate
(-) validate_on_create
(3) after_validation
(4) after_validation_on_create
(5) before_save
(6) before_create
(-) create
(7) after_create
(8) after_save
这些stat是可以用来hook
下面是一个
回调的典型例子
class CreditCard < ActiveRecord::Base # 这个例子用来说明预先处理信用卡数据,作用是在验证 # 以前把输入的数据中不是数字的输入,屏蔽掉。就是把 "555 234 34"或者 # "5552-3434" 都转换成 "55523434" def before_validation_on_create self.number = number.gsub(/[^0-9]/, "") if attribute_present?("number") end end class Subscription < ActiveRecord::Base #这是另一个回调的例子,是在创建的时候,积累时间。 #当然,这里是示例,没有人需要这个功能 before_create :record_signup private def record_signup self.signed_up_on = Date.today end end class Firm < ActiveRecord::Base # 下面的例子也经常用就是相关删除。很多时候,这件事应该是dependent => :destroy # 来完成,当然,还有些时候比较复杂的回调,就会用到类似的方法 # 当firm公司删除时,同时删除对应员工(Person)和客户(Client) before_destroy { |record| Person.destroy_all "firm_id = #{record.id}" } before_destroy { |record| Client.destroy_all "client_of = #{record.id}" } end
有继承关系的回调
下面的情景是说,当在一个类中定义了回调。但,他有一个子类,又定义了一个回调。
然后,我们希望,
有些时候,回调继承执行。就是又要执行父类的回调,又要执行子类的回调。
有些时候,希望子类的回调,重写覆盖父类的回调。
那么,看看如何实现
#这样的话,将实现回调的继承和队列调用 class Topic < ActiveRecord::Base before_destroy :destroy_author end class Reply < Topic before_destroy :destroy_readers end #也就是说,当Topic#destroy调用的时候 destroy_author将被执行。而,当Topic#destroy被执行的时候destroy_author和 destroy_readers将都被调用 #------------------------------------------------------------------------- #下面的方法,将导致覆盖 class Topic < ActiveRecord::Base def before_destroy() destroy_author end end class Reply < Topic def before_destroy() destroy_readers end end #这个时候,当Reply#destroy被调用时候将只调用destroy_readers将不会调用 destroy_author. #-------------------------------------------------------------------------
回调的四种类型
- Method references (符号),
- callback objects(最常用吧),
- inline methods (使用块方法),
- and inline eval methods (字符串).
在这其中,前两种是推荐的回调表达方式。块方法的回调有些时候,也比较合适。最后的一种,基本废弃。
class Topic < ActiveRecord::Base #这是标准的使用,把回调的方法本身,限制为private或者protected before_destroy :delete_parents private def delete_parents self.class.delete_all "parent_id = #{id}" end end
回调的参数
回调方法的参数,是记录,根据传入的不同,灵活调用。
class BankAccount < ActiveRecord::Base before_save EncryptionWrapper.new("credit_card_number") after_save EncryptionWrapper.new("credit_card_number") after_initialize EncryptionWrapper.new("credit_card_number") end class EncryptionWrapper def initialize(attribute) @attribute = attribute end def before_save(record) record.credit_card_number = encrypt(record.credit_card_number) end def after_save(record) record.credit_card_number = decrypt(record.credit_card_number) end alias_method :after_find, :after_save private def encrypt(value) # Secrecy is committed end def decrypt(value) # Secrecy is unveiled end end
method missing的应用
回调的宏,默认下会等待一个符号,但当我们在符号部分,使用method missing时,就可以在预期估值的时候,执行绑定的回调。
class Topic < ActiveRecord::Base #实现act as tree的级联删除 before_destroy 'self.class.delete_all "parent_id = #{id}"' end class Topic < ActiveRecord::Base before_destroy 'self.class.delete_all "parent_id = #{id}"', 'puts "Evaluated after parents are destroyed"' end
- * after_create
- * after_destroy
- * after_save
- * after_update
- * after_validation
- * after_validation_on_create
- * after_validation_on_update
- * before_create
- * before_destroy
- * before_save
- * before_update
- * before_validation
- * before_validation_on_create
- * before_validation_on_update
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
评论
4 楼
Hooopo
2009-08-20
good!
3 楼
夜鸣猪
2009-06-17
wxmfly 写道
good
感谢光临,动力啊,
补充完了剩下部分的翻译
2 楼
wxmfly
2009-06-17
good
1 楼
xu_ch
2009-06-15
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 890heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3215reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3242alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1438问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1343这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1303以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1860首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2239这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2230开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1194class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8092TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 1981刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1435这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1900面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17151git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2680简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 913第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1657开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12902Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2073又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
示例 Rails OAuth 2 应用程序 这个 repo 包含如何将 OAuth 2 添加到 Rails 应用程序的示例,该应用程序围绕与我们简单的 BCrypt/注册/会话身份验证系统相同的基本结构... 授权回调地址: http://localhost:9888/oauth
注册期间,请确保回调URL的值如下: http://localhost:3000/users/auth/fitbit/callback 注册后,您应该可以访问CLIENT ID和CLIENT SECRET值以放入config/secrets.yml 。 入门 克隆此存储库。 运行bin/setup 。 ...
20.2 回调 303 20.3 高级属性 308 20.4 事务 311 第21章 ActionController:路由与URL 317 21.1 基础 317 21.2 请求的路由 318 21.3 基于资源的路由 329 21.4 路由的测试 342 第22章 ActionController和Rails 345 ...
身份验证 一个 Rails 引擎,可以轻松将 Rails 站点的身份验证委托给 。 有关使用此 gem 的示例,请参阅项目。... 创建一个新应用程序,并将回调 URL 设置为http://localhost:3001/auth/so/callback 。 如
因为回调是服务器端的,所以这个 nodejs 实例必须可以通过网络访问才能工作。 有趣的文件 app.js(设置PUBLIC_TOKEN、PRIVATE_TOKEN) views/integration_iframe.ejs(这被称为启动Two Tap HTML5界面,您将看到...
归一化属性 有时,您想要在将数据保存到数据库之前对其进行规范化,例如将电子邮件的大小... 上面的示例将规范before_save回调中的:email属性。 您可以指定多个属性 normalize :email , :username , with : :downcase
其他模型将通过after_save或after_destroy回调通过它们的关联来调用它。 include CustomCounterCache :: Model define_counter_cache :articles_count do | user | user . articles . where ( state: 'published'...
开发人员使用ActiveRecord所做的大部分工作都使数据模型对所有使用者都具有相同的功能(通过使用验证和回调),而Ecto鼓励使用不太严格的行为。 尽管可以在ActiveRecord中定义这些边界(请考虑 ),但是某些应用...
另外,在某些应用程序中,我不得不重新打开类以覆盖gem的默认行为,或者跳过回调并添加其他功能,而我感觉有些问题。 有关另一个示例,请参。 因此,此分支删除了所有Wupee :: NotificationTypeConfiguration,但为...
67272_PATS_v1_sqlite 这是一个基本的Rails应用程序,已在2018年Spring作为班级演示构建。该项目的第一个版本旨在帮助学生更加熟悉Rails 5.1框架的基础;... 要设置数据库并用实际的示例记录填充数
示例:在config/initializers/omniauth.rb ,执行: Rails . application . config . middleware . use OmniAuth :: Builder do provider :clever , ENV [ 'CLEVER_CLIENT_ID' ] , ENV [ 'CLEV
但是,我们不想失去ActiveRecord的便利,例如验证,回调等。 用例示例是支持登录的模型: class SignIn < ActiveType :: Object # this is not backed by a db table attribute :username , :string ...
示例应用信息: 名称:demo_azk 简称:demo_azk 描述:demo_azk 请更改通知回调URL到ngrok URL您的内部定义Azkfile.js 添加环境变量: 复制.env.sample文件: $ cp .env.sample .env使用您的 Mercado Libre App ID ...
自定义上传回调并可以拦截文件上传以进行额外处理 允许上传最大数量的文件 每个文件上传的进度条 向后兼容 IE 7 预览上传的图像文件 通过 ID 跟踪文件 File-Drop 确实依赖于 jQuery,但除此之外,它是自包含的。 ...
10.8.1 实体的生命周期与回调事件 444 10.8.2 使用专门的监听器实现回调 448 10.8.3 为全部实体配置默认监听器 450 10.8.4 排除监听器 452 10.9 本章小结 455 第11章 JPA的查询支持 456 11.1 查询API 457 11.1.1 ...