7

वर्तमान में मेरे पास फ्रंट एंड पर TinyMCE से कुछ HTML कैप्चर करने वाला नियंत्रक है। अगर मैं फायरबग के साथ टिंकर करता हूं तो स्क्रीन पर स्क्रिप्ट टैग सबमिट करना और चेतावनी संदेश इत्यादि करना संभव है।रेलों पर रूबी में फ़ील्ड को स्वच्छ करने के लिए सबसे अच्छा तरीका

संपादित करें: वर्तमान में मैं स्वच्छ सहायक का उपयोग करके मॉडल में इस फिक्सिंग कर रहा हूँ:

require 'action_view' 

class NotesController < AuthApplicationController 

    include ActionView::Helpers::SanitizeHelper 
... 
    def update 
    params[:note][:content] = sanitize(params[:note][:content], 
     :tags => %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 

    @note.update_attributes(params[:note]) 

इस नियंत्रक में गंदा लगता है। क्या कोई बेहतर तरीका है? अर्थात। किसी भी तरह से इस ActiveRecord को एकीकृत करें ताकि मैं सत्यापन के समान तरीके से सहेजने से पहले इसे और अन्य क्षेत्रों में ऐसा करने के लिए आसानी से निर्दिष्ट कर सकूं?

किसी भी सुझाव के लिए धन्यवाद।

संपादित करें:

यहां कुछ प्रगति करना।

मेरी/Libs के तहत मैं

module SanitizeUtilities 
    def sanitize_tiny_mce(field) 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 
end 

तब मेरे मॉडल में कोड गिर

class MyModel < ActiveRecord::Base 
    include ::SanitizeUtilities 
... 
    before_save :sanitize_content 
... 
    def sanitize_content 
    self.content = sanitize_tiny_mce(self.content) 
    end 

end 

के लिए यह बहुत ज्यादा उपद्रव के बिना अवांछित मार्कअप निकाल देते हैं लगता है।

रेल इतने घबराहट के लिए बहुत नया मैं कुछ गलत कर रहा हूं। क्या कोई यहां संभावित दोषों को देख सकता है?

धन्यवाद फिर से

+0

रेल में इसे संभालने का अधिक सामान्य तरीका क्लाइंट से किसी पुराने बकवास को स्वीकार करना और इसे सहेजना (सुरक्षित रूप से, एसक्यूएल इंजेक्शन से बचने के लिए सावधान) को सहेजना है। फिर बाद में जब यह प्रदर्शित करने का समय आता है, वहां sanitize। – noodl

+2

यह मेरे लिए अजीब लगता है, मैं गंदे डेटा क्यों करना चाहूंगा? यदि मैं कई स्थानों पर डेटा को वापस पढ़ता हूं तो इससे एक स्वच्छता खोने के काम और संभावनाओं में वृद्धि होगी। – Chris

+0

@noodl इस पर क्रिस के साथ सहमत हुए। सामने डेटा को बाहर निकालने का मतलब है कि आपको केवल एक बार इस प्रक्रिया को लागू करना होगा। इसे अलग नहीं करना मतलब है कि जब भी आप डेटा प्रदर्शित करते हैं तो आपको इस प्रक्रिया को लागू करना होगा। और क्रिस ने कहा, आप एक दृश्य की रक्षा करना भूल सकते हैं। – iwasrobbed

उत्तर

11

मुझे लगता है कि जिस तरह से आप यह क्या कर रहे हैं ठीक है, लेकिन अगर आप before_save उपयोग कर रहे हैं तो आप संभवतः अभी भी सत्यापन विफल हो सकता है (के बाद से before_save सत्यापन के बाद कहा जाता है)। साथ ही, आपको इसे अपने स्वयं के मॉड्यूल में रखना जरूरी नहीं है, यह आपकी कक्षा पर एक निजी विधि हो सकता है।

कुछ की तरह:

class MyModel < ActiveRecord::Base 

    before_validation :sanitize_content, :on => :create 

    private 
    def sanitize_content 
     self.content = sanitize_tiny_mce(self.content) 
    end 
    def sanitize_tiny_mce(field) 
     ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 

end 
+0

संभवतः 'चालू: [: बनाएं, अपडेट करें] 'भी ... कोई अन्य सर्वोत्तम प्रथाओं? – Meekohi

1

इस सवाल का जवाब किया जा रहा है, लेकिन इस के लिए आ रहा किसी के लिए आप इस को अधिक पारदर्शी बनाने के लिए कस्टम mutators उपयोग करने पर विचार कर सकते हैं। कुछ ऐसा:

class MyModel < ActiveRecord::Base 
    def content= content 
    write_attribute(:content, sanitize_tiny_mce(content) 
    end 

    private 

    def sanitize_tiny_mce content 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data) 
    ); 
    end 
end 

यह सुनिश्चित करेगा कि यह सामग्री किसी भी समय बदले जाने पर संचरित हो।

संबंधित मुद्दे

 संबंधित मुद्दे