Machinist: Refer to another named blueprint inside a blueprint

Note: We are talking about Machinist 1 Show archive.org snapshot here, Machinist 2 may have solved this or might require a different approach.


Machinist allows named blueprints (e.g. User.blueprint(:admin)) that inherit from the master blueprint (User.blueprint).

If you also want to inherit from another blueprint (e.g. if "vip" should load "premium" and the master blueprint) you can do this:
User.blueprint(:vip) do
# Fields for the vip blueprint go here
instance_eval(&User.blueprint(:premium))
end

To do pretty things like...

User.blueprint(:vip) do
  # Fields for the vip blueprint go here
  inherit :premium
end

...put the attached code into spec/support/machinist_inherit.rb and require 'spec/support/machinist_inherit' in your blueprints.rb. Note that it might not be sufficient to put the file into spec/support and have the spec_helper.rb require everything in that folder. Your blueprints.rb might be required before machinist_inherit.rb.

Note: Attributes that are already set will not be overwritten when defined again. Thus, put your inherit calls after all other attribute definitions inside a blueprint.

Arne Hartherz Over 13 years ago