`

Rails回调的示例

阅读更多
先补充一个部分的代码用来说明这些回调在一些实际中的用法,

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

这些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
2
0
分享到:
评论
4 楼 Hooopo 2009-08-20  
good!
3 楼 夜鸣猪 2009-06-17  
wxmfly 写道

good&nbsp;

感谢光临,动力啊,
补充完了剩下部分的翻译
2 楼 wxmfly 2009-06-17  
good 
1 楼 xu_ch 2009-06-15  

相关推荐

    rails向导打包

    文件中会介绍 `validates` 方法的不同校验选项,如 `presence`、`uniqueness` 和 `format`,以及 `before_save`、`after_create` 等回调方法。 3. **深入浅出说路由**: 路由是 Rails 应用的心脏,定义了 URL 如何...

    Ruby on Rails 指南 v5.0.1 中文版

    - **回调**:解释ActiveRecord中可用的生命周期回调,以及如何利用这些回调增强模型的功能。 - **迁移**:介绍如何使用迁移来管理和维护数据库结构的变化。 #### ActiveRecord迁移 - **迁移概述**:解释迁移的概念...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **定义**:回调是在特定事件发生前后自动执行的代码块。 - **用途**:可用于在保存或删除记录前执行额外的逻辑处理。 ### 总结 通过以上介绍,我们不仅了解了Rails的基础知识,还深入探讨了其核心组件——Active...

    Beginning Rails 4

    继续深化 ActiveRecord 的使用,本章探讨了一些高级主题,如验证、回调、聚合查询等。 - **验证**:确保数据的有效性和一致性。 - **回调**:在特定事件发生时执行自定义逻辑。 - **聚合查询**:使用 SQL 聚合函数...

    ruby on rails 实践

    内容包括模型的基础操作、深入探讨模型查询、模型关联关系、模型校验以及回调函数的使用。 第五章“Rails中的控制器”,关注的是MVC架构中的控制器层。通过控制器层,开发者可以处理用户的输入,并将请求传递给模型...

    Ruby on Rails 学习案例

    你可以使用`before_action`和`after_action`等回调方法进行预处理和后处理。 7. **测试驱动开发(TDD)**:Rails提倡TDD,提供了RSpec和MiniTest等测试框架,鼓励开发者先写测试再编写功能代码,确保代码质量。 8....

    rails_oauth_app:如何以简单的方式将 OAuth 2 添加到 Rails 应用程序的示例

    示例 Rails OAuth 2 应用程序 这个 repo 包含如何将 OAuth 2 添加到 Rails 应用程序的示例,该应用程序围绕与我们简单的 BCrypt/注册/会话身份验证系统相同的基本结构... 授权回调地址: http://localhost:9888/oauth

    使用 rails进行敏捷开发(第三版)

    9. **ActiveSupport库**:讲解Rails提供的各种实用工具和方法,如时间辅助方法、内省和回调。 10. **资产管道**:介绍如何管理JavaScript、CSS和其他前端资源,包括Sprockets和CoffeeScript。 11. **会话与cookies...

    Rails3-使用ajax处理并发

    例如,使用jQuery,你可以设置`success`或`complete`回调函数来处理响应: ```javascript $('body').on('ajax:success', '#delete_link', function(e, data, status, xhr) { $(this).closest('tr').remove(); }); ...

    fitbit_api_rails:使用FitbitAPI gem的示例Rails应用

    注册期间,请确保回调URL的值如下: http://localhost:3000/users/auth/fitbit/callback 注册后,您应该可以访问CLIENT ID和CLIENT SECRET值以放入config/secrets.yml 。 入门 克隆此存储库。 运行bin/setup 。 ...

    example-stripe-ach-rails:Rails中的Stripe ACH示例应用程序

    6. **处理回调事件**:集成Stripe的 webhook 事件处理,以响应支付状态的变化,如支付成功、失败或退款。 7. **Plaid集成**(如果适用):引入Plaid的Gem,实现Plaid Link工具,让用户安全地链接其银行账户。 8. *...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    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-sample-blog:一个简单的跟踪Rails官方指南的博客教程

    你将学习如何定义控制器行动,以及如何在行动中使用`before_action`和`after_action`回调。 8. **用户身份验证**:为了实现用户登录功能,你可能需要引入如Devise这样的第三方gem,或者手动编写登录、注册和会话...

    multistep_model_example:示例 Rails4 应用程序使用 StateMachine 进行多步骤模型创建过程

    在这个例子中,模型可能包含了表示状态变化的属性和与StateMachine相关的回调方法。 5. **控制器(Controller)**:控制器处理HTTP请求,调用模型方法,并将结果传递给视图。在多步骤表单中,控制器会管理用户的...

    beginner-react:带有示例 React 项目和 Rails API 的存储库

    3. **处理响应**:React 组件通过 API 调用获取数据后,可以更新组件状态或调用回调函数传递数据给父组件。 4. **错误处理**:添加错误捕获机制,确保在 API 请求失败时,应用能够优雅地处理错误并反馈给用户。 这...

    Jquery AutoComplete firefox 中文 Ajax (option url or data) Jquery rails 自动完成

    3. **事件回调**:jQuery AutoComplete提供了丰富的事件回调函数,如`open`、`focus`、`select`等,这些函数可以用来定制交互行为,例如在用户选择一个建议项后执行特定的操作。 4. **自定义样式和模板**:通过CSS...

    通过deviseomni-auth使用facebook登录的示例项目_Ruby_Ja.zip

    然后,我们需要在Devise的session控制器中添加OmniAuth回调。打开`app/controllers/devise/sessions_controller.rb`,并添加如下代码: ```ruby class Devise::SessionsController prepend_before_action :allow_...

    so_auth:用于将任何 Rails 应用程序转换为 so_auth_provider 客户端的 Rails 引擎

    身份验证 一个 Rails 引擎,可以轻松将 Rails 站点的身份验证委托给 。 有关使用此 gem 的示例,请参阅项目。... 创建一个新应用程序,并将回调 URL 设置为http://localhost:3001/auth/so/callback 。 如

    rails50:使用Rails 5进行敏捷Web开发的源代码-web development source code

    `查询方法提升了查询性能,同时`update_columns`方法允许在不触发回调的情况下更新记录。 二、ActionController:控制层增强 Rails 5的ActionController模块提供了对HTTP请求的处理。其中,强参数(Strong ...

    active_rails_examples

    7. **回调(Callbacks)**: 回调允许在特定操作(如创建、更新或删除)前后执行自定义逻辑。例如,`before_save :update_name_capitalization`会在保存前自动将名字首字母大写。 8. **事务(Transactions)**: 通过...

Global site tag (gtag.js) - Google Analytics