Quiero mostrar una lista de enlaces de afiliados, cada uno etiquetado para identificar al usuario actual. Sería simple en HTML, pero estamos escribiendo una API, por lo que el resultado es JSON.Rieles: reemplazando as_json por valor dinámico: ¿hay alguna manera más inteligente?
Lo tengo funcionando, pero parece demasiado complicado. ¿Es este el mejor enfoque?
Mi modelo, AffiliateLink contiene un campo (el HTML sin formato del enlace) que voy a transformar y generar al vuelo agregando un token. Tengo un método de modelo que produce la sustitución - que no es trivial porque usamos múltiples afiliados y cada uno tiene una regla de transformación especial que este método capaz de hacer:
def link_with_token(user_token)
# some gnarly code that depends on a lot of stuff the model knows
# that returns a proper link
end
para conseguir mi html enlace correcto en JSON I han hecho estas cosas:
- suman
attr_accessor :link_html
para modelar - añadir un método de instancia para establecer el nuevo descriptor de acceso
.. .
def set_link_html(token)
self.link_html = link_with_tracking_token(token)
end
- override
as_json
en el modelo, la sustitución de la html_code original con link_html
...
def as_json(options = {})
super(:methods => :link_html, :except => :html_code)
end
- iterar sobre la colección devuelta en el método controlador para hacer la transformación
...
def index
@links = Admin::AffiliateLink.all # TODO, pagination, etc.
respond_to do |format|
format.html # index.html.erb
format.json do
@links.each do |link|
link.set_link_html(account_tracking_token)
end
render json: @links
end
end
end
Este parece ser un montón de cosas que hacer para conseguir mi transformación teensy-weensy hecho. Sugerencias útiles (relacionadas con este problema y no con otros aspectos del código, que están en proceso de cambio) son bienvenidas.
opciones como 'Rabl' o simplemente utilizar realmente una plantilla para contribuir a que su' json' vs reemplazando el método 'as_json' ¿fuera de la cuestión? – nowk
He incursionado con RABL pero parece presentar más obstáculos (especialmente como resultado de documentos limitados). Algún día, solo leeré el código y descubriré cómo usarlo. Por ahora, 'as_json' parece ser suficiente. –