This gem provides a DSL for defining adapters that map your model's representations to those of your views, and vice versa.
The adapters can be used to convert a model to its public representation, including associated models, as well as support for arbitrary operations.
FooAdapter.from_model(Foo.find(id)).to_public_hash
The adapters also understand how to "undo" the presentation logic, converting the public representation back to the model or models that (may have) generated it.
Bar.new(BarAdapter.from_public(params).to_params_hash)
Define your adapter using the DSL.
# lib/adapters/team_member_adapter.rb
require "rails_view_adapters"
RailsViewAdapters::Adapter.define(:team_member_adapter) do
map_simple :name, :author
map_date :join_date, :member_since, date_format
map_date :created_at, :created_at, date_format
map_date :updated_at, :updated_at, date_format
map_bool :admin, :super_user
hidden_field :secret
map_from_public :secret do |token|
{ secret: token }
end
map_belongs_to :team, :favorite_team, model_class: Team
map_has_many :posts, :all_posts, sub_method: :body
end
Then require and use it like you would any other class.
require "lib/adapters/team_member_adapter"
TeamMemberAdapter.from_model(TeamMember.find(params[:id])).to_public_hash
I've found it convenient to create a concern that gets invoked in a controller
before_action
to automatically grab the right adapter, instantiate it, and use
it to modify the params hash. Something like this:
module Adaptation
extend ActiveSupport::Concern
included do
append_before_action :adapt_params
end
private
def adapt_params
adapter = "#{controller_path.classify.gsub("Controller", "")}Adapter".constantize
params.merge!(adapter.from_public(params).to_params_hash) {|key,lhs,rhs| rhs}
end
end
Individual needs will vary, but for a reasonable integration test take a look at
spec/integration/an_adapter_spec.rb
Do note that the above relies on your controllers and adapters being named predictably.
http://www.rubydoc.info/github/mlibrary/rails_view_adapters/
Copyright (c) 2015 The Regents of the University of Michigan. All Rights Reserved. Licensed according to the terms of the Revised BSD License. See LICENSE.md for details.