रेल्स - एक कंट्रोलर के अंदर एक हेल्पर का उपयोग कैसे करें


207

जब मुझे एहसास होता है कि आप एक दृश्य के अंदर एक सहायक का उपयोग करने वाले हैं, तो मुझे अपने नियंत्रक में एक सहायक की आवश्यकता है क्योंकि मैं लौटने के लिए JSON ऑब्जेक्ट बना रहा हूं।

यह इस तरह से एक छोटा सा हो जाता है:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

मैं अपने html_formatसहायक तक कैसे पहुँच सकता हूँ ?


2
आप @ grosser के उत्तर पर विचार करना चाह सकते हैं, यह बहुत अधिक पूर्ण है।
टोकलैंड

मुझे पता है कि यह पुराना है लेकिन ... सादे रूबी वर्गों के साथ क्या गलत है? : पी
तारेक

जवाबों:


205

नोट: यह 2 दिनों के रेल में वापस लिखा और स्वीकार किया गया था; आजकल ग्रोसर का जवाब जाने का रास्ता है।

विकल्प 1: संभवत : सबसे आसान तरीका है कि आप अपने हेल्पर मॉड्यूल को अपने कंट्रोलर में शामिल करें:

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

विकल्प 2: या आप हेल्पर मेथड को क्लास फंक्शन के रूप में घोषित कर सकते हैं, और इसका उपयोग इस तरह कर सकते हैं:

MyHelper.html_format(comment.content)

यदि आप इसे एक उदाहरण फ़ंक्शन और एक क्लास फ़ंक्शन दोनों के रूप में उपयोग करने में सक्षम होना चाहते हैं, तो आप अपने सहायक में दोनों संस्करणों की घोषणा कर सकते हैं:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

उम्मीद है की यह मदद करेगा!


धन्यवाद, लेकिन मैं थोड़ा उलझन में हूँ। अभी मेरा हेल्पर /app/helpers/application_helper.rb में है ... AND आप सुझाव दे रहे हैं कि मैं हेल्पर को ApplicationController ले जाऊं?
AnApprentice

मैंने अपने Application_controller के लिए 'ApplicationHelper' को शामिल किया, लेकिन 'NoMethodError (अपरिभाषित विधि `html_format' के लिए ApplicationHelper: मॉड्यूल) के साथ त्रुटियां: '
AnApprentice 23:26

1
@AnApprentice ऐसा लगता है कि आपने इसका पता लगा लिया है, लेकिन मैंने अपना जवाब थोड़ा स्पष्ट कर दिया है, उम्मीद है कि चीजें स्पष्ट हो जाएंगी। पहले संस्करण में, आप बस उपयोग कर सकते हैं html_format- आपको केवल MyHelper.html_formatदूसरे में आवश्यकता है।
जेवियर होल्ट

4
यह तब काम नहीं करता है जब आप जिस सहायक विधि का उपयोग करना चाहते हैं, जैसे कि दृश्य विधियों का उपयोग करें link_to। नियंत्रकों की इन विधियों तक पहुँच नहीं है और मेरे अधिकांश सहायक इन विधियों का उपयोग करते हैं। इसके अलावा, नियंत्रक में सहायक सहित सभी सहायक तरीकों को सार्वजनिक रूप से सुलभ कार्यों के रूप में उजागर करता है जो अच्छा नहीं है। view_contextरेल 3 में जाने का रास्ता है।
ग्रेग

@GregT - पहले ग्रॉसर का जवाब नहीं देखा था, क्योंकि यह तथ्य के बाद थोड़ा सा आया था, लेकिन मुझे यह भी अच्छा लगता है। उसने सिर्फ मेरा उत्थान किया।
जेवियर होल्ट

304

आप उपयोग कर सकते हैं

  • helpers.<helper>में रेल 5 + (या ActionController::Base.helpers.<helper>)
  • view_context.<helper>( रेल 4 और 3 ) (चेतावनी: यह प्रति कॉल के लिए एक नया दृश्य उदाहरण प्रस्तुत करता है)
  • @template.<helper>( रेल 2 )
  • एक एकल वर्ग में सहायक और फिर शामिल करें singleton.helper
  • include कंट्रोलर में सहायक (चेतावनी: नियंत्रक कार्यों में सभी सहायक तरीके बनाएगा)

56
यह उत्तर और भी बेहतर है! रेल 3 में, बस कॉलिंग view_context.helper_functionसरल है और बढ़िया काम करती है। ActionController::Base.helpers.helper_functionउतना ही अच्छा है।
ट्रिसवेब

29
view_context= प्रतिभा
n_i_c_k

5
चेतावनी: उपयोग न करें view_context। यह प्रति कॉल के लिए एक नया दृश्य उदाहरण
तुरंत देगा

7
ActionController::Base.helpers.helper_functionकाम करने के लिए प्रतीत नहीं होता है। मुझे एक नियंत्रक विधि में NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:कॉल करने का प्रयास करने पर मिलता है ActionController::Base.helpers.spell_date_and_time()। कॉलिंग view_context.spell_date_and_time()हालांकि काम करता है।
कैटफ़िश

37
रेल 5: बस helpers.helper_functionअपने कंट्रोलर में उपयोग करें ( github.com/rails/rails/pull/24866 )
मार्कस

80

रेल में 5 का उपयोग करें helpers.helper_function अपने नियंत्रक में ।

उदाहरण:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

स्रोत: @Markus द्वारा एक अलग जवाब पर एक टिप्पणी से। मुझे लगा कि उसका जवाब सबसे योग्य है क्योंकि यह सबसे साफ और आसान समाधान है।

संदर्भ: https://github.com/rails/rails/pull/24866


6
थोड़ा अजीब लगता है कि कंसोल में आप helperएकवचन में कॉल करेंगे और नियंत्रक में यह बहुवचन होगा।
फेलो स्ट्रेंजर

10

विकल्प 1 के साथ मेरी समस्या हल हो गई है। संभवत: सबसे आसान तरीका है कि आप अपने हेल्पर मॉड्यूल को अपने कंट्रोलर में शामिल करें:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
केवल नकारात्मक पक्ष यह है कि यह सहायक कार्यों के नाम के साथ नियंत्रक क्रियाओं को जोड़ता है। लेकिन tbh, मैं वह भी करता हूं :)
फेलिक्स

9

सामान्य तौर पर, यदि हेल्पर को (सिर्फ) नियंत्रकों में इस्तेमाल किया जाना है, तो मैं इसे एक उदाहरण विधि के रूप में घोषित करना पसंद करता हूं class ApplicationController


5
एक संरक्षित विधि के रूप में
बेंजामिन क्राउज़ियर

3

रेल 5+ में आप सरल उदाहरण के साथ नीचे दिखाए गए फ़ंक्शन का उपयोग कर सकते हैं:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

आउटपुट

"2018-12-10 01:01 AM"

0
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

रेल में 5+ बस सहायकों ( helpers.number_to_currency (10000) ) का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.