2012-09-16 10 views
12

Mam studenta i model kursu. Student należy do przedmiotu, a kurs ma wielu studentów.jak sprawdzić poprawność identyfikatora powiązanego modelu?

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 

W postaci użyte do wygenerowania rekord studenta, ja pozwolić użytkownikowi wprowadzić identyfikator kursu.

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

Ale nie wiem, jak do sprawdzania poprawności danych wejściowych course_id przez użytkownika. Sprawdzanie poprawności modelu ucznia nie spowoduje wygenerowania błędu, nawet jeśli wpiszesz identyfikator kursu, który nie istnieje. Jak mogę go wyświetlić, aby pokazać błąd?

Odpowiedz

17

należy przyjrzeć się utworzyć niestandardową metodę weryfikacji:

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 

pierwsze, model będzie upewnić się, że course_id jest liczbą całkowitą , a następnie Twoja niestandardowa walidacja upewni się, że kurs istnieje w bazie danych.

+0

to działa :) również dzięki za poprawienie mojego oświadczenia o problemie ..haha btw, w jaki sposób mogę pozwolić użytkownikowi wybrać kurs z listy zamiast wpisywać id? Wiem, że jest pomocnikiem tagu select w szynach, więc powinienem umieścić w nim tablicę wszystkich kursów? – code4j

+0

Prawidłowo, możesz użyć 'select' wypełnionego przez tablicę kursów. Istnieje wiele przykładów SO i internetu. –

+0

thx :) Zrobiłem to. – code4j

3

Można po prostu zrobić niestandardową metodę sprawdzania, który sprawdza ważność swojej Kod przedmiotu:

# 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 

na przemian, gdy lista Oczywiście jest dyskretnym lista, można użyć: w opcji na walidacji:

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

Jest więcej opcji. Oba te przykłady pochodzą z docs Rails:

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

+0

co ty oznacza dyskretnych liście ??? – code4j

+0

Zakładając, że masz tablicę zawierającą każdy element na liście. W rzeczywistości wydaje się, że byłoby to dość nieporęczne, prawie na pewno chcesz użyć niestandardowej metody sprawdzania poprawności. – Wheeyls

3

Możesz potwierdzić obecność powiązania kursu. A więc, jeśli nie istnieje, ważne? będzie fałszywe.

Twoja klasa powinna być:

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 

Różnice sprawdzanie klucza obcego oraz stowarzyszenie samo są wyjaśnione w tym post.

Jeśli nie trzeba potwierdzić obecność oczywiście, można zrobić to obejście:

validates :course, presence: true, if: -> {course_id.present?} 
Powiązane problemy