मॉडल में सहायकों का उपयोग करना: मैं सहायक निर्भरताओं को कैसे शामिल करूं?


100

मैं एक मॉडल लिख रहा हूं जो टेक्स्ट क्षेत्र से उपयोगकर्ता इनपुट को संभालता है। Http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input से सलाह के बाद , मैं डेटाबेस में बचत से पहले मॉडल में इनपुट को साफ कर रहा हूं, पहले_का उपयोग करके वापस कॉल करें।

मेरे मॉडल के प्रासंगिक भाग इस तरह दिखते हैं:

include ActionView::Helpers::SanitizeHelper

class Post < ActiveRecord::Base {
  before_validation :clean_input

  ...

  protected

  def clean_input
    self.input = sanitize(self.input, :tags => %w(b i u))
  end
end

कहने की जरूरत नहीं है, यह काम नहीं करता है। जब मैं कोशिश करता हूं और नई पोस्ट को सहेजता हूं तो मुझे निम्न त्रुटि मिलती है।

undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>

जाहिर है, SanitizeHelper HTML का एक उदाहरण बनाता है :: WhiteListSanitizer, लेकिन जब मैं इसे अपने मॉडल में मिलाता हूं तो यह HTML :: WhiteListSanitizer नहीं मिल सकता है। क्यों? इसे ठीक करने के लिए मैं इसके बारे में क्या कर सकता हूं?

जवाबों:


133

बस पहली पंक्ति को इस प्रकार बदलें:

include ActionView::Helpers

यह काम करेगा।

अद्यतन: रेल के लिए 3 उपयोग:

ActionController::Base.helpers.sanitize(str)

क्रेडिट का जवाब देने के लिए जाता है


खुद इसे बेहतर नहीं कह सकते थे
तिलेंडर

1
धन्यवाद। मुझे इसे कक्षा की परिभाषा के अंदर शामिल करके काम करने के लिए मिला।
ओ। फ्रोबजस-डे

1
इसी के साथ मुझे मिलता है stack level too deep। यह पहले की विधि में है।
ऑटोमैटिक

42
कृपया सक्रिय रिकॉर्ड मॉडल के साथ दृश्य परत चिंताओं को न मिलाएं। यह एक भयानक अभ्यास है। एक बेहतर तरीका यह है कि एआर के सामने एक स्टैंडअलोन इनपुट डेटा सैनिटाइज़र ऑब्जेक्ट रखा जाए और इसमें से "क्लीन" विशेषताओं को पुनः प्राप्त किया जाए।
सॉलनिक

1
यह एक बहुत बुरा समाधान है और इसे आग की तरह बचा जाना चाहिए। रेल MVC (मॉडल व्यू कंट्रोलर) फ्रेमवर्क पर आधारित होती है, जहां हेल्पर व्यू भाग में आता है, इसलिए आपको मॉडल के साथ व्यू हेल्पर के तरीकों का मिश्रण नहीं करना चाहिए।
jedi

132

यह आपको हर एक्शन व्यू को लोड करने के दुष्प्रभावों के बिना सहायक विधि देता है :: हेल्पर्स विधि आपके मॉडल में:

ActionController::Base.helpers.sanitize(str)

6
मेरे जैसे धीमे लोगों के लिए - आपको कुछ भी शामिल करने की आवश्यकता नहीं है, बस एक्शनकंट्रोलर का उपयोग करें :: Base.helpers.sanitize ("जिस स्ट्रिंग को आप सैनिटाइज करना चाहते हैं")
एडवर्ड

धन्यवाद, रेल 2.3.14 में काम किया, जबकि स्वीकृत उत्तर नहीं दिया।
क्रिसइन्डेमोंटॉन

मैंने Application_helper में एक विधि जोड़ी, लेकिन मैं मॉडल से एक्शनकंट्रोलर :: Base.helpers.my_method (विकल्प) का उपयोग करके रेल 3.0.3 का उपयोग करने में सक्षम नहीं था?
टॉम रॉसी

35

यह मेरे लिए बेहतर काम करता है:

सरल:

ApplicationController.helpers.my_helper_method

अग्रिम:

class HelperProxy < ActionView::Base
  include ApplicationController.master_helper_module

  def current_user
    #let helpers act like we're a guest
    nil
  end       

  def self.instance
    @instance ||= new
  end
end

स्रोत: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model


1
ApplicationController.master_helper_moduleरेल 3 और 4 में यह प्रतीत होता है किसी भी अधिक मौजूद नहीं है। ApplicationController.helpersहालांकि एक अच्छा एक है।
शमूएल

मैंने इसके लिए (सरल विकल्प) मतदान किया क्योंकि यह मेरी आवश्यकताओं के अनुकूल था - मुझे केवल एक सहायक की आवश्यकता है जो ApplicationController में पहले के फिल्टर द्वारा सहेजी गई जानकारी का उपयोग कर रहा है, इसलिए मेरे मामले में एसोसिएशन को स्पष्ट करना एक अनुस्मारक है कि एक युग्मन है। [उपयोग का मामला मल्टी डोमेन ऐप है, जो एक मॉडल नोटिफ़ायर के माध्यम से ईमेल जारी करता है, जो ऐप के पीछे एक url लिंक के साथ है - यह यूआरएल वेब अनुरोध के डोमेन के आधार पर बदल जाता है]
iheggie

24

अपने स्वयं के नियंत्रकों से सहायकों तक पहुँचने के लिए, बस उपयोग करें:

OrdersController.helpers.order_number(@order)

2
बस उपयोग कर रहे हैं ApplicationController.helpers.order_number(@order)। इसका मतलब order_numberथा कि इसका पता लगाया गया हैOrder Helper
ksugiarto

3
@rowanu वह कह रहा है "एक्सेस करने के लिए (अपने स्वयं के नियंत्रकों से मददगार)", "(अपने स्वयं के नियंत्रकों से सहायकों तक पहुँचने के लिए)"।
Ajedi32

11

मैं इनमें से किसी भी तरीके की सिफारिश नहीं करूंगा। इसके बजाय, इसे अपने स्वयं के नामस्थान के भीतर रखें।

class Post < ActiveRecord::Base
  def clean_input
    self.input = Helpers.sanitize(self.input, :tags => %w(b i u))
  end

  module Helpers
    extend ActionView::Helpers::SanitizeHelper
  end
end

11

यदि आप my_helper_methodकिसी मॉडल के अंदर का उपयोग करना चाहते हैं , तो आप लिख सकते हैं:

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