ruby on rails - software - Mover las reglas comerciales al modelo
ruby on rails software (2)
¿Estás configurando los parámetros de la entrada del usuario?
Si no están definidos como columnas de base de datos booleanas, entonces les asignará una cadena, que nunca será igual a verdadero.
Hice una pregunta anterior que provocó algunas excelentes respuestas.
Aquí está la pregunta anterior
En la parte posterior de algunos consejos dados allí, he intentado mover la siguiente lógica de controlador
if params[:concept][:consulted_legal] == 0 && params[:concept][:consulted_marketing] == 1
@concept.attributes = {:status => ''Awaiting Compliance Approval''}
elsif params[:concept][:consulted_marketing] == 0 && params[:concept][:consulted_legal] == 1
@concept.attributes = {:status => ''Awaiting Marketing Approval''}
elsif params[:concept][:consulted_marketing] == 0 && params[:concept][:consulted_legal] == 0
@concept.attributes = {:status => ''Awaiting Marketing & Legal Approval''}
else
@concept.attributes = {:status => ''Pending Approval''}
end
en el modelo, como tal:
def set_status
if status.blank?
if (consulted_legal == true) && (consulted_marketing == true)
status = "Pending Approval"
elsif (consulted_legal == true) && (consulted_marketing == false)
status = "Awaiting Marketing Approval"
elsif (consulted_legal == false) && (consulted_marketing == true)
status = "Awaiting Legal Approval"
elsif (consulted_legal == false) && (consulted_marketing == false)
status = "Awaiting Marketing & Legal Approval"
end
end
true # Needs to return true for the update to go through
end
Lo estoy llamando desde una devolución de llamada before_save.
Como valor predeterminado, los atributos consulted_legal y consulta_marketing se establecen en falso y no nulo, por lo que estoy probando == falso o verdadero aquí, en lugar de preguntar
if consulted_legal?
por ejemplo.
Sin embargo, esta lógica no parece estar funcionando. Si inspecciono el objeto, el estado no se establece en nada, nunca. ¿Alguien puede ver por qué esto podría estar pasando? ¿Tengo cómo acceden mal a los atributos en modelos, por ejemplo?
TIA
En lugar de status =
prueba self.status =
. He descubierto que necesitaba usar mi self.
para cambiar el atributo de un modelo dentro del modelo.
También es mucho mejor tener errors.empty?
al final en lugar de true
, por lo que si alguna vez usa errors.add_to_base
en el futuro, su método set_status
está listo para abortar.
Editar:
Es posible que también desee verificar acts_as_state_machine
. Parece un complemento para exactamente lo que estás haciendo.