2012-09-16 19 views
12

Tengo un estudiante y un modelo de curso. El estudiante pertenece al curso, y el curso tiene muchos estudiantes.cómo validar el id del modelo asociado?

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 

En el formulario utilizado para crear el registro del alumno, dejo que el usuario ingrese el ID del curso.

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

Pero no sé cómo validar la entrada course_id por el usuario. La validación del modelo de estudiante no generará un error, incluso cuando escriba una ID de curso que no existe. ¿Cómo puedo mostrar el error?

Respuesta

17

Usted debe mirar en la creación de un método de validación personalizada:

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 

En primer lugar, el modelo se asegurará de que el course_id es un entero válido , y luego su validación personalizada se asegurará de que el curso exista en la base de datos.

+0

funciona :) también gracias por corregir mi declaración de problema ..haha por cierto, ¿cómo puedo dejar que el usuario elija un curso de una lista en lugar de ingresar el id? Sé que hay ayuda de la etiqueta de selección en los rieles, así que debería poner una matriz de todos los cursos dentro de ella? – code4j

+0

Correcto, puede usar 'select' poblado por la matriz de cursos. Hay muchos ejemplos en SO y en la web para eso. –

+0

thx :) Lo hice. – code4j

3

justo Usted puede hacer un método de validación personalizada que comprueba la validez de su curso Identificació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 

Alternativamente, si la lista de cursos es una lista discreta, se puede utilizar el: en la opción de validaciones:

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

Hay más opciones. Ambos ejemplos provienen de los documentos Rieles:

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

+0

¿qué medio de lista discreta ??? – code4j

+0

Suponiendo que tiene una matriz que contiene cada elemento de la lista. En realidad, parece que sería bastante difícil de manejar, casi seguro que desea utilizar el método de validación personalizado. – Wheeyls

3

Puede validar la presencia de la asociación del curso. Entonces, si no existe, ¿es válido? será falso

Su clase debe ser:

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 

Las diferencias de validación de clave externa y la propia asociación se explican en este post.

Si no es necesario para validar la presencia, por supuesto, se puede hacer esta solución:

validates :course, presence: true, if: -> {course_id.present?} 
Cuestiones relacionadas