65 votes

Est-il possible de définir un callback 'before_save' dans un module ?

Est-il possible de définir un before_save callback dans un module ? Telle qu'avec une classe comme celle-ci :

class Model
  include MongoMapper::Document
  include MyModule
end

et un module comme celui-ci :

module MyModule
  before_save :do_something

  def do_something
    #do whatever
  end  
end 

do_something sera appelé avant tout Model les objets sont sauvegardés ? J'ai essayé comme ça mais j'obtiens undefined method 'before_save' for MyModule:Module .

Je vous prie de m'excuser s'il s'agit de quelque chose de simple - je suis novice en Ruby et en Rails.

119voto

Simone Carletti Points 77653

En Ruby on Rails < 3 (sans les fonctionnalités de Rails, uniquement Ruby)

module MyModule
  def self.included(base)
    base.class_eval do
      before_save :do_something
    end
  end

  def do_something
    #do whatever
  end
end

Dans Ruby on Rails >= 3 (avec Rails Concern caractéristiques)

module MyModule
  extend ActiveSupport::Concern

  included do
    before_save :do_something
  end

  def do_something
    #do whatever
  end
end

4voto

jimworm Points 1961

Un module included pourrait être ce dont vous avez besoin.

http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included

2voto

user1136228 Points 119

Vous pouvez le faire avec ActiveSupport::Concern (en fait et sans, mais c'est plus clair et préférable)

require 'active_support/concern'

module MyModule
  extend ActiveSupport::Concern

  included do
    # relations, callbacks, validations, scopes and others...
  end

  # instance methods

  module ClassMethods
    # class methods
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X