ruby on rails 3 - validar - Prevenir el cambio de un campo en el modelo Rails
validar formulario ruby on rails (2)
Tengo dos modelos relacionados, digamos Activity
y Step
. Activity has_many :steps
y Step belongs_to :activity
que significa que la tabla de steps
tiene una columna activity_id
.
Esto está en Hobo 1.3, así que Rails 3.0.
Lo que quiero es asegurar que después de la creación del Step
no sea posible mover un paso a otra Activity
. No queremos que el campo activity_id
cambie.
He eliminado el campo de los formularios de edición, pero estoy buscando una restricción más fuerte. Esencialmente quiero validar en la update
(no en la create
) que la columna no se está tocando. La documentación de Hobo no sugiere nada por el estilo dentro de Hobo, así que estoy mirando las validaciones de Rails , pero hasta ahora no he encontrado la restricción de "solo hacer esto en la actualización" que recuerdo, ni una validación de que algo no sea cambiando
Creo que también puedes hacer esto con el sistema de permisos Hobo: http://hobocentral.net/manual/permissions
Por ejemplo:
def update_permitted?
acting_user.administrator && !activity_id_changed?
end
Puede declarar un atributo como read_only con attr_readonly :your_field_name
. Pero esto no creará un error si intenta escribir este atributo, fallará en silencio. (Este atributo se ignorará para todas las actualizaciones de SQL)
Otra opción podría ser, para escribir una validación para este caso, podría verse así:
class Step < ActiveRecord::Base
validate :activity_id_not_changed
private
def activity_id_not_changed
if activity_id_changed? && self.persisted?
errors.add(:activity_id, "Change of activity_id not allowed!")
end
end
end
persisted?
devuelve true, si este no es un registro nuevo y no se destruye.
Campo de golf:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F