2012-09-16 5 views
12

학생 및 코스 모델이 있습니다. 학생은 코스에 속하며 과정에는 많은 학생이 있습니다.연결된 모델 ID의 유효성을 검사하는 방법은 무엇입니까?

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 

학생 기록을 만드는 데 사용되는 양식에서 사용자가 코스 ID를 입력하도록합니다.

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

그러나 사용자가 입력 한 course_id의 유효성 검사 방법을 모르겠습니다. 학생 모델 유효성 검사는 존재하지 않는 강좌 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

작동 :) 또한 내 문제를 진술서를 수정 주셔서 감사합니다. 하하 btw, 어떻게 사용자가 목록에서 id를 입력하는 대신 과정을 선택하게 할 수 있습니까 ?? 레일에 선택 태그의 도우미가 있다는 것을 압니다. 그래서 모든 배열을 배열 안에 넣어야합니까? – code4j

+0

맞습니다. 코스 배열로 채워진'select'를 사용할 수 있습니다. SO와 웹에는 많은 예제가 있습니다. –

+0

thx :) 나는 그것을 만들었다. – code4j

3

당신은 당신의 코스 ID의 유효성을 확인하는 사용자 정의 유효성 검사 방법을 수행 할 수 있습니다 과정 목록이 분리 된 목록 인 경우

# 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

코스 연관성을 확인할 수 있습니다. 그래서, 존재하지 않으면, 유효합니까? 거짓이 될 것입니다.

클래스가 있어야한다 : 외래 키와 자신이 post에 설명이 협회의 유효성을 검사

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 

의 차이.

은 물론 존재를 검증 할 필요가없는 경우,이 문제를 해결 할 수 있습니다 : 당신이 분리 된 목록의 의미 않는 것을

validates :course, presence: true, if: -> {course_id.present?} 
관련 문제