ruby on rails "अपरिभाषित विधि" रेलिंग में नियंत्रक से सहायक विधि को बुलाते समय




ruby-on-rails helper (9)

क्या किसी को पता है कि मुझे क्यों मिलता है

undefined method `my_method' for #<MyController:0x1043a7410>

जब मैं अपने ApplicationController उपवर्ग से my_method ("स्ट्रिंग") कहता हूं? मेरा कंट्रोलर जैसा दिखता है

class MyController < ApplicationController
  def show
    @value = my_method(params[:string])
  end
end

और मेरा सहायक

module ApplicationHelper
  def my_method(string)
    return string
  end
end

और अंत में, ApplicationController

class ApplicationController < ActionController::Base
  after_filter :set_content_type
  helper :all
  helper_method :current_user_session, :current_user
  filter_parameter_logging :password
  protect_from_forgery # See ActionController::RequestForgeryProtection for details

इस तरह Application_controller.rb फ़ाइल में ApplicationHelper शामिल करें:

class ApplicationController < ActionController::Base
  protect_from_forgery       
  include ApplicationHelper  
end

इस तरह से application_helper.rb फ़ाइल में परिभाषित सभी विधियाँ नियंत्रक में उपलब्ध होंगी।

आप व्यक्तिगत नियंत्रकों में व्यक्तिगत सहायकों को भी शामिल कर सकते हैं।


इस पोस्ट में gamecreature द्वारा कहा गया है:

  • रेल में 2 @template चर का उपयोग करें।
  • रेल 3 में नियंत्रक विधि view_context उपयोग करें

view_context आपका मित्र है, http://apidock.com/rails/AbstractController/Rendering/view_context

यदि आप नियंत्रक और दृश्य के बीच साझा करना चाहते हैं तो आपके पास और विकल्प हैं:


आप नियंत्रकों से सहायकों को नहीं बुला सकते। आपका सबसे अच्छा शर्त है कि ApplicationController में विधि बनाना अगर इसे कई नियंत्रकों में उपयोग करने की आवश्यकता है।

संपादित करें : स्पष्ट होने के लिए, मुझे लगता है कि बहुत से भ्रम (सही होने पर मुझे सही करें) helper :all से उपजा है helper :all कॉल। helper :all वास्तव में दृश्य पक्ष पर किसी भी नियंत्रक के तहत उपयोग के लिए आपके सभी सहायकों को शामिल करते हैं। रेल के पहले के संस्करणों में, सहायकों के नाम-निर्धारण ने निर्धारित किया कि कौन से नियंत्रकों के विचार सहायकों का उपयोग कर सकते हैं।

आशा है कि ये आपकी मदद करेगा।


सहायकों के विचार हैं, लेकिन उस कोड को शामिल करने के लिए CodeController.rb में सहायक फ़ाइल को शामिल करने से आपकी समस्या का ध्यान रखा जा सकता है। अपने मामले में, ApplicationController.rb में निम्नलिखित लाइन डालें:

include ApplicationHelper

हालाँकि, कंट्रोलर में हेल्पर्स को कॉल करने का यह अच्छा अभ्यास नहीं है क्योंकि हेल्पर्स का उपयोग करने के लिए किया जाता है, इसलिए कंट्रोलर में हेल्पर्स का उपयोग करने का सबसे अच्छा तरीका एप्लिकेशन_कंट्रोलर में एक सहायक विधि बनाना है और उन्हें कंट्रोलर को कॉल करना है।
लेकिन यहां तक ​​कि अगर यह एक नियंत्रक में सहायक को कॉल करने के लिए आवश्यक है
तब बस नियंत्रक में सहायक को शामिल करें

class ControllerName < ApplicationController
  include HelperName
  ...callback statements..

और हेल्पर विधियों को सीधे कंट्रोलर को कॉल करें

 module OffersHelper
  def generate_qr_code(text)
    require 'barby'
    require 'barby/barcode'
    require 'barby/barcode/qr_code'
    require 'barby/outputter/png_outputter'
    barcode = Barby::QrCode.new(text, level: :q, size: 5)
    base64_output = Base64.encode64(barcode.to_png({ xdim: 5 }))
    "data:image/png;base64,#{base64_output}"
  end

नियंत्रक

class ControllerName < ApplicationController
include OffersHelper

def new
  generate_qr_code('Example Text')
end
end

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


मुझे भी यही समस्या थी...

आप इसके चारों ओर हैक / चकमा दे सकते हैं, उस तर्क को एक मॉडल में डाल सकते हैं, या इसके लिए विशेष रूप से एक वर्ग बना सकते हैं। मॉडल उन pesky सहायक विधियों के विपरीत, नियंत्रकों के लिए सुलभ हैं।

यहाँ मेरा "rag.rb" मॉडल है

class Rag < ActiveRecord::Base
  belongs_to :report
  def miaow()
    cat = "catattack"
  end  
end

यहाँ मेरे "rags_controller.rb" नियंत्रक का हिस्सा है

def update
  @rag = Rag.find(params[:id])
  puts @rag.miaow()
  ...

"अपडेट" पर क्लिक करने के बाद, इसने टर्मिनल पर कैटैटैक दिया।

एक तात्कालिकता को देखते हुए, मॉडल में विधियों को बुलाया जा सकता है। कुछ कोड के साथ कैटेटैक को बदलें। (यह मेरे लिए अब तक का सबसे अच्छा है)

: सहायक केवल विचारों के लिए सहायकों को खोलता है।

इससे पता चलता है कि कक्षा कैसे बनाई जाती है और इसे कैसे कॉल किया जाता है। http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true


जहाँ तक मुझे पता है, helper :all सहायकों को विचारों में उपलब्ध कराता है ...


अपने कंट्रोलर view_context.helper_name से सीधे सहायक फ़ंक्शन तक पहुंचने का प्रयास करें





applicationcontroller