मैं रेल पर रूबी (संस्करण 3) में गैर-मानक कस्टम PHP ढांचे में बनाए गए एप्लिकेशन से कोड स्थानांतरित कर रहा हूं। PHP संस्करण में सभी नियंत्रक वास्तव में वसा वाले होते हैं, पतले मॉडल के साथ, जिन्हें मैं हमेशा से असहमत हूं, इसलिए मैं मॉडल स्तर पर रेल के सत्यापन के तरीके का आनंद ले रहा हूं, जो शायद इन वसा नियंत्रकों में क्या हो रहा है का 9 0% वर्तमान में।उपयोगकर्ता अनुमतियों के आधार पर रेल 3 ActiveRecord सत्यापन
एक समस्या का सामना करना पड़ रहा है, और यह सुनिश्चित करने के लिए अनिश्चित है कि मॉडल को बदलने के आधार पर अलग-अलग सत्यापन नियमों के आधार पर यह अलग-अलग सत्यापन नियमों का है। उदाहरण के लिए, एक व्यवस्थापक, या रिकॉर्ड का मूल निर्माता रिकॉर्ड को ध्वजांकित करने के लिए सक्षम होना चाहिए (सॉफ्ट डिलीट) जबकि सभी को नहीं करना चाहिए।
class Something < ActiveRecord::Base
...
validates :deleted, :owned_by_active_user => true
...
end
class OwnedByActiveUserValidator < ActiveModel::EachValidator
validate_each(record, attr_name, attr_value)
# Bad idea to have the model know about things such as sessions?
unless active_user.admin? || active_user.own?(record)
record.errors.add :base, "You do not have permission to delete this record"
end
end
end
के बाद से मॉडल ही (सिद्धांत में) उपयोगकर्ता के लिए जो परिवर्तन कर रहा है के बारे में पता, क्या बात की इस तरह करने के लिए "जिस तरह से रेल" क्या है? क्या मुझे सक्रिय उपयोगकर्ता को रिकार्ड पर वर्चुअल एट्रिब्यूट (वास्तव में डीबी में सहेजा नहीं गया) के रूप में सेट करना चाहिए, या क्या मुझे इन चेक को नियंत्रक में करना चाहिए? मुझे स्वीकार करना है, सक्रिय उपयोगकर्ता पर मॉडल जांच अनुमतियां अजीब लगती हैं, और जब मॉडल का परीक्षण करने की बात आती है तो जटिलता बढ़ जाती है।
एक कारण मैं मॉडल में जितना संभव हो उतना अधिक रखने के इच्छुक हूं, क्योंकि मैं एक एपीआई (ओएथ पर पहुंच गया) और एक वेबसाइट दोनों प्रदान करना चाहता हूं, बिना बहुत अधिक कोड डुप्लिकेट किए, जैसे कि अनुमतियों के प्रकार के प्रकार।
धन्यवाद, मुझे आपके साथ सहमत होना है। मेरे मॉडल को ऐसा करना चाहिए जैसा कि उन्हें बताया गया है (बशर्ते व्यवसाय तर्क उन्हें अनुमति देता है)। मेरे नियंत्रकों को यह तय करना चाहिए कि उन्हें कौन बताता है। मैं बस यह सुनिश्चित कर दूंगा कि मैं गोर के विवरण को यथासंभव सर्वोत्तम रूप से दूर कर सकता हूं। – d11wtq
डोगमा ... मुझे पता है कि यह आमतौर पर किया जाता है, लेकिन ऐसा लगता है कि मॉडल में एक्सेस कंट्रोल डालना एक सुरुचिपूर्ण समाधान है यदि आप मॉडल को अपना डेटा एपीआई/बिजनेस नियम लेयर मानते हैं। यह एक ही मॉडल को एक ही मॉडल को छूने वाले एकाधिक नियंत्रकों में एक ही जानकारी दोहराने से बचाता है।और उद्देश्य के लिए वैधकर्ताओं का उपयोग करना भी वास्तव में सुविधाजनक लगता है - "क्षमा करें, आपको उस फ़ील्ड को संपादित करने की अनुमति नहीं है" जैसी त्रुटियां उत्पन्न कर सकती हैं। हालांकि, वह क्षेत्र पहली जगह में नहीं दिखाया जाना चाहिए था। इच्छा है कि एक ऐसा समाधान था जिसने फॉर्म बिल्डरों के लिए आत्मनिरीक्षण की अनुमति दी। – odigity
आप फ़ॉर्म-मॉडल (डेटाबेस-समर्थित नहीं) कक्षाएं बना सकते हैं जो फॉर्म निर्माता द्वारा आवश्यक सत्यापन और विधियों को लागू करते हैं। – yfeldblum