Skip to content
Rails plugin to dry-initializer gem
Ruby
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib Support activerecord relations as models Feb 12, 2018
spec Support activerecord relations as models Feb 12, 2018
.codeclimate.yml Initial commit May 16, 2016
.gitignore Switch to dry-initializer v0.3.0+ May 19, 2016
.rspec Initial commit May 16, 2016
.rubocop.yml
.travis.yml Bump v3.1.1 May 6, 2019
CHANGELOG.md Bump v3.1.1 May 6, 2019
Gemfile Fix Gemfile May 16, 2016
Guardfile Initial commit May 16, 2016
LICENSE.txt Initial commit May 16, 2016
README.md
Rakefile
dry-initializer-rails.gemspec

README.md

dry-initializer-rails Join the chat at https://gitter.im/dry-rb/chat

Gem Version Build Status Code Climate Test Coverage Inline docs

Rails plugin to dry-initializer

Installation

Add this line to your application's Gemfile:

gem 'dry-initializer-rails'

And then execute:

$ bundle

Or install it yourself as:

$ gem install dry-initializer-rails

Synopsis

The gem provides value coercion to ActiveRecord instances.

Add the :model setting to param or option:

require 'dry-initializer'
require 'dry-initializer-rails'

class CreateOrder
  extend Dry::Initializer

  # Params and options
  param  :customer, model: 'Customer'                 # use either a name
  option :product,  model: Product                    # or a class
  option :coupon,   model: Coupon.where(active: true) # or relation

  def call
    Order.create customer: customer, product: product, coupon: coupon
  end
end

Now you can assign values as pre-initialized model instances:

customer = Customer.create(id: 1)
product  = Product.create(id: 2)
coupon   = Coupon.create(id: 3, active: true)

order = CreateOrder.new(customer, product: product, coupon: coupon).call
order.customer # => #<Customer @id=1 ...>
order.product  # => #<Product @id=2 ...>
order.coupon   # => #<Coupon @id=3 ...>

...or their ids:

order = CreateOrder.new(1, product: 2, coupon: 3).call
order.customer # => #<Customer @id=1 ...>
order.product  # => #<Product @id=2 ...>
order.coupon   # => #<Coupon @id=3 ...>

The instance is envoked using method find_by!(id: ...).

order = CreateOrder.new(1, product: 2, coupon: 4).call
# raises #<ActiveRecord::RecordNotFound>

You can specify custom key for searching model instance:

require 'dry-initializer-rails'

class CreateOrder
  extend Dry::Initializer

  param  :customer, model: 'User', find_by: 'name'
  option :product,  model: Item,   find_by: :name
end

This time you can pass names (not ids) to the initializer:

order = CreateOrder.new('Andrew', product: 'the_thing_no_123').call

order.customer # => <User @name='Andrew' ...>
order.product  # => <Item @name='the_thing_no_123' ...>

Compatibility

Tested under MRI 2.2+.

Contributing

  • Fork the project
  • Create your feature branch (git checkout -b my-new-feature)
  • Add tests for it
  • Commit your changes (git commit -am '[UPDATE] Add some feature')
  • Push to the branch (git push origin my-new-feature)
  • Create a new Pull Request

License

The gem is available as open source under the terms of the MIT License.

You can’t perform that action at this time.