2012-09-16 31 views
12

Tôi có một học sinh và một mô hình khóa học. Sinh viên thuộc về khóa học, và khóa học có nhiều sinh viên.cách xác thực id mô hình được liên kết?

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 

Trong biểu mẫu được sử dụng để tạo hồ sơ học sinh, tôi cho phép người dùng nhập ID khóa học.

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

Nhưng tôi không biết cách xác thực đầu vào course_id của người dùng. Xác thực mô hình sinh viên sẽ không tạo ra lỗi, ngay cả khi tôi nhập ID khóa học không tồn tại. Tôi làm cách nào để hiển thị lỗi?

Trả lời

17

Bạn nên xem xét việc tạo ra một phương pháp xác nhận tùy chỉnh:

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 

Thứ nhất, mô hình của bạn sẽ đảm bảo rằng các course_id là một số nguyên hợp lệ , và sau đó xác nhận tùy chỉnh của bạn sẽ đảm bảo rằng khóa học tồn tại trong cơ sở dữ liệu.

+0

nó hoạt động :) cũng cảm ơn để sửa vấn đề của tôi ..haha btw, làm thế nào tôi có thể cho phép người dùng chọn một khóa học từ danh sách hơn là nhập id ?? Tôi biết có helper của thẻ chọn trong đường ray, vì vậy tôi nên đặt một mảng của tất cả các khóa học bên trong nó? – code4j

+0

Đúng, bạn có thể sử dụng 'select' được điền bởi các mảng khóa học. Có rất nhiều ví dụ về SO và web cho điều đó. –

+0

thx :) Tôi đã thực hiện nó. – code4j

3

Bạn chỉ có thể thực hiện một phương pháp xác nhận tùy chỉnh để kiểm tra tính hợp lệ của quá trình id của bạn:

# 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 

Cách khác, nếu danh sách tất nhiên là một danh sách rời rạc, bạn có thể sử dụng: trong tùy chọn trên kiểm chứng thực:

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

Có nhiều tùy chọn hơn. Cả hai ví dụ đến từ các tài liệu Rails:

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

+0

những gì bạn có nghĩa là danh sách rời rạc ??? – code4j

+0

Giả sử rằng bạn có một mảng chứa từng mục trong danh sách. Trên thực tế điều này có vẻ như nó sẽ được khá unwieldly, bạn gần như chắc chắn muốn sử dụng phương pháp xác nhận tùy chỉnh. – Wheeyls

3

Bạn có thể xác thực sự hiện diện của liên kết khóa học. Vì vậy, nếu không tồn tại, hợp lệ? sẽ là sai.

lớp học của bạn nên là:

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 

Sự khác biệt của việc chứng thực chính nước ngoài và các hiệp hội riêng của mình được giải thích tại post này.

Nếu bạn không cần phải xác nhận sự hiện diện của tất nhiên, bạn có thể làm việc này:

validates :course, presence: true, if: -> {course_id.present?} 
Các vấn đề liên quan