Define a routing concern using a name.
Concerns may be defined inline, using a block, or handled by another object, by passing that object as the second parameter.
The concern object, if supplied, should respond to call
, which
will receive two parameters:
1 2 | * The current mapper * A hash of options which the concern object may use |
Options may also be used by concerns defined in a block by accepting a block parameter. So, using a block, you might do something as simple as limit the actions available on certain resources, passing standard resource options through the concern:
1 2 3 4 5 6 7 8 9 | concern :commentable do |options| resources :comments , options end resources :posts , concerns: :commentable resources :archived_posts do # Don't allow comments on archived posts concerns :commentable , only: [ :index , :show ] end |
Or, using a callable object, you might implement something more specific to your application, which would be out of place in your routes file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # purchasable.rb class Purchasable def initialize(defaults = {}) @defaults = defaults end def call(mapper, options = {}) options = @defaults .merge(options) mapper.resources :purchases mapper.resources :receipts mapper.resources :returns if options[ :returnable ] end end # routes.rb concern :purchasable , Purchasable. new (returnable: true ) resources :toys , concerns: :purchasable resources :electronics , concerns: :purchasable resources :pets do concerns :purchasable , returnable: false end |
Any routing helpers can be used inside a concern. If using a callable,
they're accessible from the Mapper
that's passed to call
.
Please login to continue.