Class: Tapioca::Compilers::Dsl::ActionControllerHelpers
- Extended by:
- T::Sig
- Defined in:
- lib/tapioca/compilers/dsl/action_controller_helpers.rb
Overview
Tapioca::Compilers::Dsl::ActionControllerHelpers decorates RBI files for all
subclasses of ::ActionController::Base
to add helper methods (see https://api.rubyonrails.org/classes/ActionController/Helpers.html).
For example, with the following MyHelper module:
module MyHelper
def greet(user)
# ...
end
def localized_time
# ...
end
end
and the following controller:
class UserController < ActionController::Base
helper MyHelper
helper { def age(user) "99" end }
helper_method :current_user_name
def current_user_name
# ...
end
end
this generator will produce an RBI file `user_controller.rbi` with the following content:
~~~rbi
# user_controller.rbi
# typed: strong
class UserController
sig { returns(UserController::HelperProxy) }
def helpers; end
end
module UserController::HelperMethods
include MyHelper
sig { params(user: T.untyped).returns(T.untyped) }
def age(user); end
sig { returns(T.untyped) }
def current_user_name; end
end
class UserController::HelperProxy < ::ActionView::Base
include UserController::HelperMethods
end
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
Methods inherited from Base
Constructor Details
This class inherits a constructor from Tapioca::Compilers::Dsl::Base
Instance Method Details
#decorate(root, constant) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/tapioca/compilers/dsl/action_controller_helpers.rb', line 78 def decorate(root, constant) helper_proxy_name = "#{constant}::HelperProxy" helper_methods_name = "#{constant}::HelperMethods" proxied_helper_methods = constant._helper_methods.map(&:to_s).map(&:to_sym) # Create helper method module root.create_module(helper_methods_name) do |helper_methods| helpers_module = constant._helpers gather_includes(helpers_module).each do |ancestor| helper_methods.create_include(ancestor) end helpers_module.instance_methods(false).each do |method_name| method = if proxied_helper_methods.include?(method_name) constant.instance_method(method_name) else helpers_module.instance_method(method_name) end create_method_from_def(helper_methods, method) end end # Create helper proxy class root.create_class(helper_proxy_name, superclass: "::ActionView::Base") do |proxy| proxy.create_include(helper_methods_name) end # Define the helpers method root.path(constant) do |controller| create_method(controller, 'helpers', return_type: helper_proxy_name) end end |
#gather_constants ⇒ Object
113 114 115 |
# File 'lib/tapioca/compilers/dsl/action_controller_helpers.rb', line 113 def gather_constants ::ActionController::Base.descendants.reject(&:abstract?) end |