2010-11-28 18 views
6

मैं रेल के लिए अपेक्षाकृत नया हूं और थोड़ा हैरान है कि यह कॉन्फ़िगर करने योग्य व्यवहार नहीं है ... कम से कम कोई भी मुझे अभी तक नहीं ढूंढ पाया है?! मैंने सोचा होगा कि 99% रूपों को व्हाइटस्पेस से सभी string & text फ़ील्ड से छंटनी से फायदा होगा?! मान लीजिए कि मैं गलत हूं ...रेल 3 स्ट्रिप व्हाइटस्पेस सभी रूपों पर पहले_विधीकरण

भले ही, मैं एक रेल 3 ऐप में फॉर्म फ़ील्ड (प्रकार: स्ट्रिंग &: टेक्स्ट) से सभी व्हाइटस्पेस को पट्टी करने के लिए एक DRY तरीका ढूंढ रहा हूं।

विचारों में हेल्पर्स हैं जिन्हें स्वचालित रूप से संदर्भित किया जाता है (शामिल?) और प्रत्येक दृश्य के लिए उपलब्ध ... लेकिन मॉडल में ऐसी कोई चीज़ नहीं लगती है?! या वे करते हैं?

तो वर्तमान में मैं जिसके बाद पहलेकी आवश्यकता है और तो whitespace_helper (उर्फ WhitespaceHelper) भी शामिल है कर। लेकिन यह अभी भी मेरे लिए बहुत सूखी नहीं लगता है, लेकिन यह काम करता है ...

ClassName.rb:

require 'whitespace_helper' 

class ClassName < ActiveRecord::Base 
    include WhitespaceHelper 
    before_validation :strip_blanks 

    ... 

    protected 

    def strip_blanks 
    self.attributeA.strip! 
    self.attributeB.strip! 
    ... 
    end 

lib/whitespace_helper.rb:

module WhitespaceHelper 
    def strip_whitespace 
    self.attributes.each_pair do |key, value| 
    self[key] = value.strip if value.respond_to?('strip') 
    end 
end 

मुझे लगता है मैं कर रहा हूँ कहीं भी (lib/?) डालने के लिए एक एकल (डीआरवाई) विधि (कक्षा?) की तलाश है जो पैराम (या विशेषताओं) की एक सूची ले लेगा और विशेष रूप से नामित प्रत्येक विशेषता w/आउट से व्हाइटस्पेस (.strip!?) को हटा देगा।

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/4272028/is-there-a- ड्राई-वे-टू-यूज-स्ट्रिप-ऑन-ऑल-पैराम्स-जब-बिल्डिंग-ए-न्यू-मॉडल-इन-रेल) –

+0

आप इसे एक सहायक में डाल सकते हैं और इसे अपने मॉडल –

+0

में शामिल कर सकते हैं धन्यवाद लेकिन यह केवल ऐसा लगता है काम करने के लिए अगर मुझे पहले 'whitespace_helper' की आवश्यकता है और फिर उसी फ़ाइल में' WhitespaceHelper' शामिल करें '। यह ड्रवाई कैसा है? अनावश्यक लगता है ... क्या कोई समझा सकता है? – Meltemi

उत्तर

7

एक before_validation सहायक के रूप में देखा here

module Trimmer 
    def trimmed_fields *field_list 
    before_validation do |model| 
     field_list.each do |n| 
     model[n] = model[n].strip if model[n].respond_to?('strip') 
     end 
    end 
    end 
end 

require 'trimmer' 
class ClassName < ActiveRecord::Base 
    extend Trimmer 
    trimmed_fields :attributeA, :attributeB 
end 
+0

आप क्यों नहीं बस समयानुकूल करने पर विधि परिभाषित नहीं करते और 'कक्षा में Trimmer' का विस्तार? –

+1

@ सैम्यॉन सिर्फ सम्मेलन, जो भी काम करेगा। इस तरह आप एक ही मॉड्यूल में इंस्टेंस और क्लास हेल्पर्स शामिल कर सकते हैं। मैंने 'ActiveSupport :: Concern' का उपयोग करने के लिए उदाहरण अपडेट किया है जो पढ़ने के लिए बहुत आसान है। –

+1

मेह, 'ActiveSupport :: Concern' अच्छा है, लेकिन विस्तार इस मामले में आसान है। –

0

नोट मैं इस प्रयास नहीं किया है और यह एक पागल विचार हो सकता है बनाने के लिए है, लेकिन आप इस तरह एक वर्ग बना सकते हैं:

MyActiveRecordBase < ActiveRecord::Base 
    require 'whitespace_helper' 
    include WhitespaceHelper 
end 

। .. और उसके बाद आपके मॉडल एआर :: बेस:

MyModel < MyActiveRecordBase 
    # stuff 
end 
1

यू के बजाय इसके उत्तराधिकारी हैं AutoStripAttributes gem for Rails से। यह आपको कार्य को आसानी से और साफ करने में मदद करेगा।

class User < ActiveRecord::Base 
# Normal usage where " aaa bbb\t " changes to "aaa bbb" 
    auto_strip_attributes :nick, :comment 

    # Squeezes spaces inside the string: "James Bond " => "James Bond" 
    auto_strip_attributes :name, :squish => true 

    # Won't set to null even if string is blank. " " => "" 
    auto_strip_attributes :email, :nullify => false 
end 
की [सभी पर पट्टी का उपयोग करने के लिए एक सूखी तरीका है?: पैरामीटर जब रेल में एक नया मॉडल बनाने]