2012-09-16 16 views
12

मेरे पास एक छात्र और एक कोर्स मॉडल है। छात्र पाठ्यक्रम से संबंधित है, और पाठ्यक्रम में कई छात्र हैं।संबंधित मॉडल आईडी को कैसे सत्यापित करें?

class Student < ActiveRecord::Base 
    attr_accessible :course_id, :name, :password, :status, :studentID, :year 
    belongs_to :course 

    validates :name, :password, :status, :studentID, :year, :presence =>true 
    validates_associated :course 
end 

class Course < ActiveRecord::Base 
    attr_accessible :courseCode, :courseName, :courseYr 
    validates :courseCode,:courseName,:courseYr, :presence => true 
    validates :courseCode,:courseYr, :uniqueness=>{:message=>"Cannot repeat the code"} 

    has_many :students 
end 

छात्र रिकॉर्ड बनाने के लिए प्रयुक्त फॉर्म में, मैंने उपयोगकर्ता को कोर्स आईडी दर्ज करने दिया।

<div class="field"> 
    <%= f.label :course_id %><br /> 
    <%= f.text_field :course_id %> 
</div> 

लेकिन मैं कैसे उपयोगकर्ता द्वारा course_id इनपुट को मान्य करने के पता नहीं है। छात्र मॉडल सत्यापन एक त्रुटि उत्पन्न नहीं करेगा, भले ही मैं एक कोर्स आईडी टाइप करता हूं जो अस्तित्व में नहीं है। त्रुटि दिखाने के लिए मैं इसे कैसे प्राप्त करूं?

उत्तर

17

आप एक कस्टम सत्यापन विधि बनाने में दिखना चाहिए:

class Student < ActiveRecord::Base 
    validates :course_id, presence: true, numericality: { only_integer: true } 
    ... 
    validate :validate_course_id 

private 

    def validate_course_id 
    errors.add(:course_id, "is invalid") unless Course.exists?(self.course_id) 
    end 
end 

पहले, अपने मॉडल सुनिश्चित करें कि course_id एक मान्य पूर्णांक है कर देगा , और फिर आपका कस्टम सत्यापन सुनिश्चित करेगा कि पाठ्यक्रम डेटाबेस में मौजूद है।

+0

यह काम करता है :) मेरी समस्या कथन को सही करने के लिए भी धन्यवाद ..हाहा बीटीडब्ल्यू, मैं आईडी को दर्ज करने के बजाय उपयोगकर्ता को सूची से कोर्स कैसे चुन सकता हूं ?? मुझे पता है कि रेल में चुनिंदा टैग का सहायक है, इसलिए मुझे इसके अंदर सभी पाठ्यक्रमों की एक सरणी डालना चाहिए? – code4j

+0

सही, आप पाठ्यक्रमों की सरणी द्वारा 'चयन' का उपयोग कर सकते हैं। इसके लिए SO और वेब पर बहुत से उदाहरण हैं। –

+0

thx :) मैंने इसे बनाया है। – code4j

3

तुम सिर्फ एक कस्टम सत्यापन विधि है कि अपने पाठ्यक्रम आईडी की वैधता की जाँच करता है कर सकते हैं: सत्यापन पर विकल्प में:

# course.rb 
validates :course_id_is_valid 

def course_id_is_valid 
    if #course id isn't valid 
    errors.add(:course_id, "is invalid") 
    end 
end 

या फिर, यदि पाठ्यक्रम सूची एक असतत सूची है, तो आप उपयोग कर सकते हैं

# course.rb 
validates :course_id, :inclusion => { :in => list_of_courses, :message => "%{value} is not a course id" } 

और विकल्प हैं। इन उदाहरणों में से दोनों रेल डॉक्स से आते हैं:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods

+0

क्या आप असतत सूची का मतलब है है ??? – code4j

+0

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

3

आप कोर्स एसोसिएशन की उपस्थिति को मान्य कर सकते हैं। तो, यदि मौजूद नहीं है, तो वैध? झूठा होगा

आपका वर्ग होना चाहिए:

class Student < ActiveRecord::Base 
    attr_accessible :course_id, :name, :password, :status, :studentID, :year 
    belongs_to :course 

    validates :course, :name, :password, :status, :studentID, :year, presence: true 
end 

विदेशी कुंजी और संघ ही इस post में वर्णन किया गया है मान्य के मतभेद।

आप निश्चित रूप से उपस्थिति को मान्य करने की जरूरत नहीं है, तो आप इस समाधान कर सकते हैं:

validates :course, presence: true, if: -> {course_id.present?} 
संबंधित मुद्दे