Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

342
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!