Posted over 6 years ago. Visible to the public. Repeats.

Define class methods with Modularity traits

There are two ways to define a class method from a Modularity trait. Note that the usual caveats regarding class method visibility apply.

Using define_method

The recommended way is to define a method on your module's singleton class:

Copy
# ruby 1.9+ module SomeTrait as_trait do define_singleton_method :foo do # ... end end end # ruby <1.9 module SomeTrait as_trait do singleton_class.send :define_method, :foo do # ... end end end

Using def (has caveats!)

Alternatively, you can def the method on self:

Copy
module SomeTrait as_trait do def self.foo # ... end end end

This is quite concise and results in faster methods than using define_method. However, you cannot use it with parametrized traits.

The following will fail:

Copy
module SomeTrait as_trait do |name| def self.foo puts name # will raise an error because the variable 'name' is not bound to the method body end end end

By refactoring problematic code and creating automated tests, makandra can vastly improve the maintainability of your Rails application.

Author of this card:

Avatar
Henning Koch
Last edit:
over 2 years ago
by Besprechungs-PC
Keywords:
static, method
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Henning Koch to makandropedia