module Unpoly::Rails::Change::FieldDefinition::ClassMethods

Public Instance Methods

field(name, type, method: name, response_header_name: nil) click to toggle source
# File lib/unpoly/rails/change/field_definition.rb, line 21
def field(name, type, method: name, response_header_name: nil)
  field = type.new(name)

  define_method "#{method}_field" do
    field
  end

  define_method "#{method}_from_request_headers" do
    raw_value = request.headers[field.header_name]
    field.parse(raw_value)
  end

  define_method "#{method}_param_name" do
    field.param_name
  end

  define_method "serialized_#{method}" do
    value = send(method)
    field.stringify(value)
  end

  # define_method "#{name}_from_response_headers" do
  #   raw_value = response.headers[field.header_name]
  #   field.parse(raw_value)
  # end

  define_method "#{method}_from_params" do
    raw_value = params[field.param_name]
    field.parse(raw_value)
  end

  define_method "#{method}_from_request" do
    value = send("#{method}_from_request_headers")
    if value.nil?
      value = send("#{method}_from_params")
    end
    value
  end

  define_method "write_#{method}_to_response_headers" do
    value = send(method)
    stringified = field.stringify(value)
    if stringified.present? # app servers don't like blank header values
      header_name = response_header_name || field.header_name
      response.headers[header_name] = stringified
    end
  end
end