13

私は学生とコースモデルを持っています。学生はコースに属し、コースには多くの学生がいます。

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 を入力しても、学生モデルの検証でエラーは発生しません。エラーを表示するにはどうすればよいですか?

4

3 に答える 3

18

カスタム検証メソッドの作成を検討する必要があります。

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が有効な整数であることを確認し、カスタム検証はコースがデータベースに存在することを確認します。

于 2012-09-16T22:44:38.617 に答える
4

コース関連付けの存在を検証できます。では、存在しない場合は有効ですか? 偽になります。

クラスは次のようになります。

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?}
于 2014-09-12T12:18:02.697 に答える
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

別の方法として、コース リストが個別のリストである場合は、検証で :in オプションを使用できます。

# 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

于 2012-09-16T22:41:20.543 に答える