Ruby on Rails 5.2 - AbstractController::Helpers::ClassMethods

मॉड्यूल AbstractController :: सहायकों :: ClassMethods




ruby

मॉड्यूल AbstractController :: सहायकों :: ClassMethods

सार्वजनिक प्रवृत्ति के तरीके

# File actionpack/lib/abstract_controller/helpers.rb, line 117
def clear_helpers
  inherited_helper_methods = _helper_methods
  self._helpers = Module.new
  self._helper_methods = Array.new

  inherited_helper_methods.each { |meth| helper_method meth }
  default_helper_module! unless anonymous?
end

इस वर्ग के सभी मौजूदा मददगारों को साफ करता है, केवल सहायक को इस वर्ग के नाम के साथ रखता है।

सहायक (* आर्ग्स, और ब्लॉक) शो स्रोत
# File actionpack/lib/abstract_controller/helpers.rb, line 107
def helper(*args, &block)
  modules_for_helpers(args).each do |mod|
    add_template_helper(mod)
  end

  _helpers.module_eval(&block) if block_given?
end

helper श्रेणी विधि सहायक मॉड्यूल नाम, एक ब्लॉक, या दोनों की एक श्रृंखला ले सकती है।

विकल्प

  • *args - Module , Symbol , String

  • block - सहायक विधियों को परिभाषित करने वाला एक ब्लॉक

जब तर्क एक मॉड्यूल होता है तो इसे सीधे टेम्प्लेट क्लास में शामिल किया जाएगा।

helper FooHelper # => includes FooHelper

जब तर्क एक स्ट्रिंग या प्रतीक होता है, तो विधि "_helper" प्रत्यय प्रदान करेगी, फ़ाइल की आवश्यकता होगी और टेम्पलेट वर्ग में मॉड्यूल शामिल करेगा। दूसरा रूप दिखाता है कि नामांकित नियंत्रकों के साथ काम करते समय कस्टम हेल्पर्स को कैसे शामिल किया जाए, या अन्य मामलों में जहां हेल्पर परिभाषा वाली फाइल रेल के मानक लोड पथों में से एक में नहीं है:

helper :foo             # => requires 'foo_helper' and includes FooHelper
helper 'resources/foo'  # => requires 'resources/foo_helper' and includes Resources::FooHelper

इसके अतिरिक्त, helper वर्ग विधि एक ब्लॉक प्राप्त कर सकती है और उसका मूल्यांकन कर सकती है, जिससे टेम्पलेट को उपलब्ध तरीके परिभाषित हो सकते हैं।

# One line
helper { def hello() "Hello, world!" end }

# Multi-line
helper do
  def foo(bar)
    "#{bar} is the very best"
  end
end

अंत में, उपरोक्त सभी शैलियों को एक साथ मिलाया जा सकता है, और helper विधि को symbols , strings , modules और ब्लॉकों के मिश्रण से मंगाया जा सकता है।

helper(:three, BlindHelper) { def mice() 'mice' end }
हेल्पर_मेथोड (* मेथ्स) शो सोर्स
# File actionpack/lib/abstract_controller/helpers.rb, line 60
      def helper_method(*meths)
        meths.flatten!
        self._helper_methods += meths

        meths.each do |meth|
          _helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
            def #{meth}(*args, &blk)                               # def current_user(*args, &blk)
              controller.send(%(#{meth}), *args, &blk)             #   controller.send(:current_user, *args, &blk)
            end                                                    # end
          ruby_eval
        end
      end

एक नियंत्रक विधि को एक सहायक के रूप में घोषित करें। उदाहरण के लिए, निम्नलिखित current_user और logged_in? बनाता है logged_in? देखने के लिए उपलब्ध नियंत्रक विधियाँ:

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

एक दृश्य में:

<% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>

पैरामीटर

  • method[, method] - नियंत्रक पर एक विधि का नाम या नाम दृश्य पर उपलब्ध कराने के लिए।

विरासत में मिला (klass) दिखाएँ स्रोत
# File actionpack/lib/abstract_controller/helpers.rb, line 32
def inherited(klass)
  helpers = _helpers
  klass._helpers = Module.new { include helpers }
  klass.class_eval { default_helper_module! } unless klass.anonymous?
  super
end

जब एक वर्ग विरासत में मिलता है, तो उसके सहायक मॉड्यूल को एक नए मॉड्यूल में लपेटें। यह सुनिश्चित करता है कि माता-पिता वर्ग के मॉड्यूल को बच्चे वर्ग के स्वतंत्र रूप से बदला जा सकता है।

सुपरक्लास विधि कहता है
# File actionpack/lib/abstract_controller/helpers.rb, line 143
def modules_for_helpers(args)
  args.flatten.map! do |arg|
    case arg
    when String, Symbol
      file_name = "#{arg.to_s.underscore}_helper"
      begin
        require_dependency(file_name)
      rescue LoadError => e
        raise AbstractController::Helpers::MissingHelperError.new(e, file_name)
      end

      mod_name = file_name.camelize
      begin
        mod_name.constantize
      rescue LoadError
        # dependencies.rb gives a similar error message but its wording is
        # not as clear because it mentions autoloading. To the user all it
        # matters is that a helper module couldn't be loaded, autoloading
        # is an internal mechanism that should not leak.
        raise NameError, "Couldn't find #{mod_name}, expected it to be defined in helpers/#{file_name}.rb"
      end
    when Module
      arg
    else
      raise ArgumentError, "helper must be a String, Symbol, or Module"
    end
  end
end

निम्नलिखित व्यवहार के साथ स्वीकार्य प्रकार के सहायकों से सामान्यीकृत मॉड्यूल की सूची लौटाता है:

String या Symbol

: FooBar या "FooBar" "foo_bar_helper" बन जाता है,

और "foo_bar_helper.rb" आवश्यकता_ निर्भरता का उपयोग करके भरी हुई है।

Module

आगे की प्रक्रिया नहीं

उपयुक्त फ़ाइलों को लोड करने के बाद, संबंधित मॉड्यूल वापस कर दिए जाते हैं।

पैरामीटर

  • args - सहायकों की एक सरणी

रिटर्न

  • Array - प्रदान की गई सहायकों की सूची के लिए मॉड्यूल की एक सामान्यीकृत सूची।