Module | ActionController::Helpers::ClassMethods |
In: |
vendor/rails/actionpack/lib/action_controller/helpers.rb
|
The template helpers serves to relieve the templates from including the same inline code again and again. It’s a set of standardized methods for working with forms (FormHelper), dates (DateHelper), texts (TextHelper), and Active Records (ActiveRecordHelper) that’s available to all templates by default.
It’s also really easy to make your own helpers and it’s much encouraged to keep the template files free from complicated logic. It’s even encouraged to bundle common compositions of methods from other helpers (often the common helpers) as they’re used by the specific application.
module MyHelper def hello_world() "hello world" end end
MyHelper can now be included in a controller, like this:
class MyController < ActionController::Base helper :my_helper end
…and, same as above, used in any template rendered from MyController, like this:
Let’s hear what the helper has to say: <%= hello_world %>
Declare a helper:
helper :foo
requires ‘foo_helper’ and includes FooHelper in the template class.
helper FooHelper
includes FooHelper in the template class.
helper { def foo() "#{bar} is the very best" end }
evaluates the block in the template class, adding method foo.
helper(:three, BlindHelper) { def mice() 'mice' end }
does all three.
# File vendor/rails/actionpack/lib/action_controller/helpers.rb, line 65 65: def helper(*args, &block) 66: args.flatten.each do |arg| 67: case arg 68: when Module 69: add_template_helper(arg) 70: when String, Symbol 71: file_name = arg.to_s.underscore + '_helper' 72: class_name = file_name.camelize 73: 74: begin 75: require_dependency(file_name) 76: rescue LoadError => load_error 77: requiree = / -- (.*?)(\.rb)?$/.match(load_error).to_a[1] 78: msg = (requiree == file_name) ? "Missing helper file helpers/#{file_name}.rb" : "Can't load file: #{requiree}" 79: raise LoadError.new(msg).copy_blame!(load_error) 80: end 81: 82: add_template_helper(class_name.constantize) 83: else 84: raise ArgumentError, 'helper expects String, Symbol, or Module argument' 85: end 86: end 87: 88: # Evaluate block in template class if given. 89: master_helper_module.module_eval(&block) if block_given? 90: end
Declare a controller attribute as a helper. For example,
helper_attr :name attr_accessor :name
makes the name and name= controller methods available in the view. The is a convenience wrapper for helper_method.
# File vendor/rails/actionpack/lib/action_controller/helpers.rb, line 112 112: def helper_attr(*attrs) 113: attrs.flatten.each { |attr| helper_method(attr, "#{attr}=") } 114: end
Declare a controller method as a helper. For example,
helper_method :link_to def link_to(name, options) ... end
makes the link_to controller method available in the view.
# File vendor/rails/actionpack/lib/action_controller/helpers.rb, line 96 96: def helper_method(*methods) 97: methods.flatten.each do |method| 98: master_helper_module.module_eval "def \#{method}(*args, &block)\ncontroller.send(%(\#{method}), *args, &block)\nend\n" 99: end 100: end