Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

345
Vistas
¿Determinar en el modelo qué controlador desencadena la acción de guardar?

Desarrollo de aplicaciones Rails tanto para api como para front-end. entonces tenemos un controlador de productos para api y un controlador de productos para el frente y el modelo de Producto es uno para ambos.

Como eso

 class Api::V1::ProductsController < ActionController::API def create @product.save end end class ProductsController < ActionController::Base def create @product.save render @product end end class Product < ActiveRecord::Base def weight=(value) weight = convert_to_lb super(weight) end end

Básicamente en producto tenemos 'campo de peso' y este campo es básicamente capturar peso del almacén. será una unidad diferente para el usuario. así que voy a guardar cualquier peso capturado por unidad, es lb, g o piedra, pero se convertirá a lb y se almacenará en la base de datos.

Así que escribo el método overide para la conversación. pero quiero que este método de anulación solo llame a la aplicación frontal y no a la API. porque api siempre publicará el peso en lb (es necesario convertirlo en el lado del cliente)

¿Alguien puede sugerir la solución? ¿Qué debo usar o qué debo hacer para este tipo de escenario? Sugiera si también hay otra solución para ese tipo de situación. Gracias por adelantado.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Es mejor mantener el modelo del Product lo más simple posible ( principio de responsabilidad única ) y mantener la conversión de peso fuera.

Creo que sería genial usar el patrón Decorator . Imagine una clase que funcione así:

 @product = ProductInKilogram.new(Product.find(params[:id])) @product.update product_params @product.weight # => kg weight here

Por lo tanto, debe usar este nuevo ProductInKilogram de Api::V1::ProductsController únicamente.

Tienes opciones para implementar eso.

Herencia

 class ProductInKilogram < Product def weight=(value) weight = convert_to_lb super(weight) end end product = ProductInKilogram.find(1) product.weight = 1

Es fácil, pero la complejidad de ProductInKilogram es alta. Por ejemplo, no puede probar dicha clase en un aislamiento sin base de datos.

Delegador simple

 class ProductInKilogram < SimpleDelegator def weight=(value) __getobj__.weight = convert_to_lb(value) end end ProductInKilogram.new(Product.find(1))

Rubí simple (mi favorito)

 class ProductInKilogram def initialize(obj) @obj = obj end def weight=(value) @obj.weight = convert_to_lb(value) end def weight convert_to_kg @obj.weight end def save @obj.save end # All other required methods end

Parece un poco detallado, pero es simple. Es bastante fácil probar esa clase, porque no hace nada sobre la persistencia.

Enlaces

  • Principio de responsabilidad única
  • Joya de delegado
  • Patrón Decorador en Ruby
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda