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 endBá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.
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.
class ProductInKilogram < Product def weight=(value) weight = convert_to_lb super(weight) end end product = ProductInKilogram.find(1) product.weight = 1Es fácil, pero la complejidad de ProductInKilogram es alta. Por ejemplo, no puede probar dicha clase en un aislamiento sin base de datos.
class ProductInKilogram < SimpleDelegator def weight=(value) __getobj__.weight = convert_to_lb(value) end end ProductInKilogram.new(Product.find(1)) 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 endParece un poco detallado, pero es simple. Es bastante fácil probar esa clase, porque no hace nada sobre la persistencia.