2012-09-16 15 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

それは働く:)私の問題の声明を修正するためのまたありがとう.hhaha btw、どのようにユーザーがIDを入力するのではなく、リストからコースを選択させることができますか?私はレールに選択タグのヘルパーがあることを知っているので、私はそれの中にすべてのコースの配列を配置する必要がありますか? – code4j

+0

正しいですが、 'select'を使ってコースの配列に値をつけることができます。 SOとWebにはたくさんの例があります。 –

+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" } 

その他のオプションがあります。これらの例の両方が、Railsのドキュメントから来る:

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?} 
関連する問題