Sha256: cc3c8ba69cddcdc8b9241c203c01d72e297f9f1dfa15f3b249195353a9cd2996

Contents?: true

Size: 1.92 KB

Versions: 4

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

require 'slim/include'
require 'json'

# All app controllers must be subclasses of ApplicationController
module MvcOne
  class ApplicationController
    DEFAULT_LAYOUT = './app/views/application_layout.slim'
    DEFAULT_HTTP_CODE = 200

    attr_accessor :env
    attr_reader :action, :params, :request

    def self.before_action(*methods)
      define_method :before_action do
        methods.each { |method| send(method) }
      end
    end

    def initialize(env, params, request)
      @env = env
      @params = params
      @request = request
    end

    def resolve(action)
      before_action if respond_to?(:before_action)

      @action = action
      send(action)
    end

    def render(code: DEFAULT_HTTP_CODE, headers: {}, body: nil, layout: DEFAULT_LAYOUT, template: nil)
      return [code, headers, [body]] unless body.nil?

      body = prepare_body(layout, template || template_path(action))
      [code, headers, [body]]
    end

    def head(code, headers: {})
      [code, headers, []]
    end

    def request_params
      return @request_params if defined?(@request_params)
      return @request_params = {} if request.body.nil?

      @request_params =
        case request.content_type
        when 'application/json' then JSON.parse(request.body.read).transform_keys(&:to_sym)
        else request.params.transform_keys(&:to_sym)
        end
    end

    def render_partial(name, options = {}, &block)
      Slim::Template.new("#{name}.slim", options).render(self, &block)
    end

    private

    def template_path(action)
      path = self.class.to_s.delete_suffix('Controller').split('::').map(&:downcase).join('/')
      "./app/views/#{path}/#{action}.slim"
    end

    def prepare_body(layout, template)
      return Slim::Template.new(template).render(self) if layout.nil?

      Slim::Template.new(layout).render(self) do
        Slim::Template.new(template).render(self)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
mvc_one-0.1.0.pre.rc7 lib/mvc_one/controllers/application_controller.rb
mvc_one-0.1.0.pre.rc6 lib/mvc_one/controllers/application_controller.rb
mvc_one-0.1.0.pre.rc5 lib/mvc_one/controllers/application_controller.rb
mvc_one-0.1.0.pre.rc4 lib/mvc_one/controllers/application_controller.rb