class Shamu::Services::Request

Define the attributes and validations required to request a change by a {Service}. You can use the Request in place of an ActiveRecord model in rails forms_helpers.

“` module Document

module Request
  class Change < Shamu::Services::Request
    attribute :title, presence: true
    attribute :author_id, presence: true
  end

  class Create < Change
  end

  class Update < Change
    attribute :id, presence: true
  end
end

end “`

Constants

REQUEST_ACTION_PATTERN

Public Class Methods

coerce( params ) click to toggle source

Coerces a hash or params object to a proper {Request} object. @param [Object] params to be coerced. @return [Request] the coerced request.

# File lib/shamu/services/request.rb, line 104
def coerce( params )
  if params.is_a?( self )
    params
  elsif params.respond_to?( :to_h ) || params.respond_to?( :to_attributes )
    new( params )
  elsif params.nil?
    new
  else
    raise ArgumentError
  end
end
coerce!( params ) click to toggle source

Coerces the given params object and raises an ArgumentError if any of the parameters are invalid. @param (see .coerce) @return (see .coerce)

# File lib/shamu/services/request.rb, line 120
def coerce!( params )
  coerced = coerce( params )
  raise ArgumentError unless coerced.valid?
  coerced
end
model_name() click to toggle source

@return [ActiveModel::Name] used by url_helpers or form_helpers etc.

when generating model specific names for this request.
# File lib/shamu/services/request.rb, line 130
def model_name
  @model_name ||= begin
    base_name = name || ""
    parts     = reduce_model_name_parts( base_name.split( "::" ) )
    parts     = ["Request"] if parts.empty?
    base_name = parts.join "::"

    ::ActiveModel::Name.new( self, nil, base_name )
  end
end

Private Class Methods

reduce_model_name_parts( parts ) click to toggle source
# File lib/shamu/services/request.rb, line 143
def reduce_model_name_parts( parts )
  while last = parts.last
    if last == "Request"
      parts[-1] = parts[-2].singularize
      break
    end

    last.sub! REQUEST_ACTION_PATTERN, ""
    if last.empty?
      parts.pop
      next
    end

    last = last.singularize
    parts[-1] = last
    break
  end

  parts
end

Public Instance Methods

apply_to( model ) click to toggle source

Applies the attributes of the request to the given model. Only handles scalar attributes. For more complex associations, override in a custom {Request} class.

@param [Object] model or object to apply the attributes to. @return [model]

# File lib/shamu/services/request.rb, line 36
def apply_to( model )
  self.class.attributes.each do |name, _|
    method = :"#{ name }="
    model.send method, send( name ) if model.respond_to?( method ) && set?( name )
  end

  model
end
complete( success ) click to toggle source

Mark the request as complete and run any {#on_success} or #{on_fail} callbacks.

@param [Boolean] success true if the request was completed successfully.

# File lib/shamu/services/request.rb, line 78
def complete( success )
  if success
    @on_success_blocks && @on_success_blocks.each( &:call )
  else
    @on_fail_blocks && @on_fail_blocks.each( &:call )
  end

  @on_complete_blocks && @on_complete_blocks.each( &:call )
end
error( *args ) click to toggle source

Adds an error to {#errors} and returns self. Used when performing an early return in a service method

@example

next request.error( :title, "should be clever" ) unless title_is_clever?

@return [self]

# File lib/shamu/services/request.rb, line 95
def error( *args )
  errors.add( *args )
  self
end
on_complete( &block ) click to toggle source

Execute block when the service is done processing the request.

# File lib/shamu/services/request.rb, line 68
def on_complete( &block )
  @on_complete_blocks ||= []
  @on_complete_blocks << block
end
on_fail( &block ) click to toggle source

Execute block if the request is not satisfied by the service.

# File lib/shamu/services/request.rb, line 62
def on_fail( &block )
  @on_fail_blocks ||= []
  @on_fail_blocks << block
end
on_success( &block ) click to toggle source

Execute block if the request is satisfied by the service successfully.

# File lib/shamu/services/request.rb, line 56
def on_success( &block )
  @on_success_blocks ||= []
  @on_success_blocks << block
end
persisted?() click to toggle source

Entities are always immutable - so they are considered persisted. Use a {Services::ChangeRequest} to back a form instead.

# File lib/shamu/services/request.rb, line 47
def persisted?
  if respond_to?( :id )
    !!id
  else
    fail NotImplementedError, "override persisted? in #{ self.class.name }"
  end
end