# Service class emulates Rails ActiveRecord class ActiveRecord def initialize(params={}); end end # Order model class Order < ActiveRecord attr_accessor :country_code, :first_name, :last_name, :gross_price, :website def valid? !gross_price.nil? end def errors [].tap{|e| e << {some_attr: 'Error message'}} end def self.last all.last end def self.all [ Order.new(country_code: 'RU', first_name: 'Petr', last_name: 'Sergeev', gross_price: 10) ] end end # Service class emulates Rails ApplicationController class ApplicationController def render(params) puts params[:json].inspect end end # Orders Controller class OrdersController < ApplicationController def create(params) @gross_price = params[:gross_price] @website = params[:website] @country_code = params[:country_code] || previous_order.country_code @first_name = params[:first_name] || previous_order.first_name @last_name = params[:last_name] || previous_order.last_name order = Order.new(checkout_params.merge(price_params)) order.website = @website order.gross_price = price_params[:gross_price] if order.valid? render json: {order: order} else render json: {errors: order.errors} end end def previous_order Order.last end def checkout_params return @checkout_params if @checkout_params @checkout_params = { first_name: @first_name, last_name: @last_name, country_code: @country_code, } end def price_params @price_params = @price_params || { gross_price: @gross_price } end end # Samples OrdersController.new.create(country_code: 'DE', first_name: 'Alex', gross_price: 10 ) OrdersController.new.create(country_code: 'DE', first_name: 'Alex' )