2010-01-29 9 views
5

मैं गए रेल सुरक्षा चिंताओं पर पढ़ रहा साथ बड़े पैमाने पर काम सुरक्षा चिंता का विषय है और मुझे बनाता है कि सबसे अधिक चिंतित बड़े पैमाने पर काम है। मेरा आवेदन attr_accessible का उपयोग कर रहा है, हालांकि मुझे यकीन नहीं है कि मुझे पता है कि खुलासा संबंधों को संभालने का सबसे अच्छा तरीका क्या है। आइए मान लें कि हमारे पास मूल सामग्री निर्माण/स्वामित्व वेबसाइट है। कोई उपयोगकर्ता ब्लॉग पोस्ट बना सकता है, और उस ब्लॉग पोस्ट से जुड़ी एक श्रेणी हो सकती है।रेल: belongs_to रिश्तों

तो मैं तीन मॉडल है:

  • उपयोगकर्ता
  • पोस्ट: उपयोगकर्ता के अंतर्गत आता है

मैं: एक उपयोगकर्ता और एक वर्ग

  • श्रेणी के अंतर्गत आता category_id पर बड़े पैमाने पर असाइनमेंट की अनुमति दें, इसलिए उपयोगकर्ता इसे बाहर कर सकता है, सी इसे अपनी श्रेणियों में से एक में, या बड़े पैमाने पर असाइनमेंट के माध्यम से, मुझे लगता है कि वे इसे किसी और की श्रेणी में बदल सकते हैं। यही वह जगह है जहां मैं इस बारे में अनिश्चित हूं कि आगे बढ़ने का सबसे अच्छा तरीका क्या होगा।

    संसाधनों की जांच की गई है (विशेष रूप से railscast #178 और resource जो कि रेलवेकास्ट से प्रदान की गई थी), दोनों का उल्लेख है कि एसोसिएशन को बड़े पैमाने पर असाइन करने योग्य नहीं होना चाहिए, जो समझ में आता है। मैं सिर्फ यकीन नहीं और कैसे उपयोगकर्ता को बदलने के लिए क्या पद की श्रेणी एक railsy तरह से होगा अनुमति देने के लिए कर रहा हूँ।

    यह कैसे हल करने के लिए सबसे अच्छा पर कोई भी विचार? क्या मैं इसे गलत तरीके से देख रहा हूं?

    अद्यतन: उम्मीद है कि मेरी चिंता को थोड़ा और स्पष्ट करें।

    def create 
        @post = Post.new(params[:category]) 
    
        @post.user_id = current_user.id 
    
        # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER 
    
        # continue on as normal here 
    end 
    

    कि बहुत काम की तरह लगता है:

    मान लीजिए कि मैं पोस्ट कर रहा हूँ चलो, मैं निम्नलिखित की तरह कुछ की जरूरत है? मुझे अद्यतन और निर्माण दोनों में प्रत्येक नियंत्रक पर जांच करने की आवश्यकता होगी। ध्यान रखें कि संबंधों के संबंध में केवल एक ही है।

  • उत्तर

    0

    ठीक कुछ है, तो थोड़ा के आसपास की खोज कर सकते हैं बनाते हैं, और अंत में मेरे लिए कुछ काम करने योग्य के साथ आया था।मैं नियंत्रकों जहां संभव से बाहर तर्क रखने पसंद है, तो यह समाधान एक मॉडल के आधार पर समाधान है:

    # Post.rb 
    validates_each :asset_category_id do |record, attr, value| 
        self.validates_associated_permission(record, attr, value) 
    end 
    
    # This can obviously be put in a base class/utility class of some sort. 
    def self.validates_associated_permission(record, attr, value) 
        return if value.blank? 
        class_string = attr.to_s.gsub(/_id$/, '') 
        klass = class_string.camelize.constantize 
    
        # Check here that the associated record is the users 
        # I'm leaving this part as pseudo code as everyone's auth code is 
        # unique. 
        if klass.find_by_id(value).can_write(current_user) 
        record.errors.add attr, 'cannot be found.' 
        end 
    end 
    

    मैंने यह भी पाया है कि रेल 3.0 के लिए आवश्यक 3 लाइनों के बजाय इस निर्दिष्ट करने के लिए एक बेहतर तरीका होगा अल्ट्रा जेनेरिक validates_each।

    http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators

    +0

    अन्य उत्तर बहुत उपयोगी था, लेकिन वास्तव में मेरी समस्या हल हो गई, इस प्रकार मैं इसे स्वीकार कर रहा हूं। – dpb

    5

    आपका उपयोगकर्ता किसी तरह का संपादित रूप के माध्यम से इसे बदल सकते हैं, मुझे लगता है।

    उस आधार पर, जन असाइनमेंट नापाक प्रकार जो कर्ल जैसी चीजों के माध्यम से अपने अनुप्रयोग के साथ गड़बड़ करने के लिए की तलाश के लिए वास्तव में है। मैं उन्हें कर्ल kiddies बुलाओ।

    यह कहने के लिए कि यदि आप attr_protected का उपयोग करते हैं - (यहां आप उन फ़ील्ड्स डालते हैं जिन्हें आप नहीं बदलना चाहते हैं) या बच्चे के पसंदीदा attr_accessible (फ़ील्ड जो बदलने के लिए ठीक हैं)।

    आप दोनों के लिए बहस सुनेंगे, लेकिन यदि आप अपने CategoryController # में अपने मॉडल में attr_protected :user_id का उपयोग करें, और उसके बाद कार्रवाई आप की तरह

    def create 
        @category = Category.new(params[:category]) 
    
        @category.user_id = current_user.id 
        respond_to do |format| 
    ....#continue on as normal here 
    end 
    
    +0

    धन्यवाद @pjammer। मैं विशेष रूप से उपरोक्त उदाहरण में रूचि रखता हूं। जो आपने लिखा है वह सही है, लेकिन मुझे पोस्ट से श्रेणी से संबंधित__ में अधिक दिलचस्पी है। पोस्ट और श्रेणी पर current_user के लिए मेरे पास पहले से कुछ ऐसा है (हालांकि मेरे पास मॉडल में है)। – dpb

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