2009-03-03 19:42:20 -05:00
|
|
|
module AbstractController
|
|
|
|
module Helpers
|
2009-05-28 12:35:36 -04:00
|
|
|
extend ActiveSupport::Concern
|
2009-05-07 11:29:22 -04:00
|
|
|
|
2009-08-06 17:48:48 -04:00
|
|
|
include RenderingController
|
2009-05-07 11:38:57 -04:00
|
|
|
|
2009-08-09 02:28:46 -04:00
|
|
|
def self.next_serial
|
|
|
|
@helper_serial ||= 0
|
|
|
|
@helper_serial += 1
|
|
|
|
end
|
|
|
|
|
2009-05-07 11:38:57 -04:00
|
|
|
included do
|
2009-06-09 17:50:01 -04:00
|
|
|
extlib_inheritable_accessor(:_helpers) { Module.new }
|
2009-08-09 02:28:46 -04:00
|
|
|
extlib_inheritable_accessor(:_helper_serial) do
|
|
|
|
AbstractController::Helpers.next_serial
|
|
|
|
end
|
2009-03-03 19:42:20 -05:00
|
|
|
end
|
2009-05-11 13:22:07 -04:00
|
|
|
|
2009-03-03 19:42:20 -05:00
|
|
|
module ClassMethods
|
2009-06-09 17:50:01 -04:00
|
|
|
# When a class is inherited, wrap its helper module in a new module.
|
|
|
|
# This ensures that the parent class's module can be changed
|
|
|
|
# independently of the child class's.
|
2009-03-03 19:42:20 -05:00
|
|
|
def inherited(klass)
|
2009-06-09 17:50:01 -04:00
|
|
|
helpers = _helpers
|
|
|
|
klass._helpers = Module.new { include helpers }
|
2009-05-28 10:49:02 -04:00
|
|
|
|
2009-03-03 19:42:20 -05:00
|
|
|
super
|
|
|
|
end
|
2009-05-22 18:17:05 -04:00
|
|
|
|
|
|
|
# Declare a controller method as a helper. For example, the following
|
|
|
|
# makes the +current_user+ controller method available to the view:
|
|
|
|
# class ApplicationController < ActionController::Base
|
|
|
|
# helper_method :current_user, :logged_in?
|
|
|
|
#
|
|
|
|
# def current_user
|
|
|
|
# @current_user ||= User.find_by_id(session[:user])
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# def logged_in?
|
|
|
|
# current_user != nil
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# In a view:
|
|
|
|
# <% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>
|
2009-06-09 17:50:01 -04:00
|
|
|
#
|
|
|
|
# ==== Parameters
|
|
|
|
# meths<Array[#to_s]>:: The name of a method on the controller
|
|
|
|
# to be made available on the view.
|
2009-03-03 19:42:20 -05:00
|
|
|
def helper_method(*meths)
|
|
|
|
meths.flatten.each do |meth|
|
2009-06-09 17:50:01 -04:00
|
|
|
_helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
|
2009-03-03 19:42:20 -05:00
|
|
|
def #{meth}(*args, &blk)
|
|
|
|
controller.send(%(#{meth}), *args, &blk)
|
|
|
|
end
|
|
|
|
ruby_eval
|
|
|
|
end
|
|
|
|
end
|
2009-05-28 10:49:02 -04:00
|
|
|
|
2009-06-09 17:50:01 -04:00
|
|
|
# Make a number of helper modules part of this class' default
|
|
|
|
# helpers.
|
|
|
|
#
|
|
|
|
# ==== Parameters
|
|
|
|
# *args<Array[Module]>:: Modules to be included
|
|
|
|
# block<Block>:: Evalulate the block in the context
|
|
|
|
# of the helper module. Any methods defined in the block
|
|
|
|
# will be helpers.
|
2009-05-22 18:17:05 -04:00
|
|
|
def helper(*args, &block)
|
2009-08-09 02:28:46 -04:00
|
|
|
self._helper_serial = AbstractController::Helpers.next_serial + 1
|
|
|
|
|
2009-03-03 19:42:20 -05:00
|
|
|
args.flatten.each do |arg|
|
|
|
|
case arg
|
|
|
|
when Module
|
|
|
|
add_template_helper(arg)
|
|
|
|
end
|
|
|
|
end
|
2009-06-09 17:50:01 -04:00
|
|
|
_helpers.module_eval(&block) if block_given?
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
# Makes all the (instance) methods in the helper module available to templates
|
|
|
|
# rendered through this controller.
|
|
|
|
#
|
|
|
|
# ==== Parameters
|
|
|
|
# mod<Module>:: The module to include into the current helper module
|
|
|
|
# for the class
|
|
|
|
def add_template_helper(mod)
|
|
|
|
_helpers.module_eval { include mod }
|
2009-03-03 19:42:20 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2009-05-28 10:49:02 -04:00
|
|
|
end
|