So che quando utilizzo i modelli di visualizzazione (html, rabl), non ho bisogno di una chiamata di rendering esplicita nell'azione del mio controller perché, per impostazione predefinita, Rails rende il modello con il nome corrispondente al nome dell'azione del controller. Mi piace questo concetto (non mi interessa il rendering nel mio codice controller) e quindi mi chiedo se questo è possibile anche quando si utilizza ActiveModel :: Serializer?ActiveModel :: Serializer richiede una chiamata di rendering esplicita?
esempio, questo è il codice da un controllore generato (Rotaie 4.1.0):
class ProductsController < ApplicationController
before_action :set_product, only: [:show, :edit, :update, :destroy]
#other actions
# GET /products/1
# GET /products/1.json
def show
end
end
e questo è il serializzatore:
class ProductSerializer < ActiveModel::Serializer
attributes :id, :name, :description, :url, :quantity, :price
end
/products/1.json Colpire, avrei si aspettano due cose accadano:
- campi non elencati nel serializzatore da ommited,
- Oggetto JSON intero da incapsulare in un campo di livello superiore 'prodotto'.
Tuttavia, ciò non accade, l'intero serializzatore viene ignorato. Ma allora se modifico il metodo Show al seguente:
# GET /products/1
# GET /products/1.json
def show
@product = Product.find(params[:id])
respond_to do |format|
format.html
format.json { render json: @product }
end
end
e ora è tutto bene, ma ho perso il vantaggio del filtro before_action (e mi sembra che ho qualche codice ridondante).
Come dovrebbe essere fatto?
@zmilojko Hai provato a utilizzare ['answer_with'] (http://api.rubyonrails.org/classes/ActionController/MimeResponds.html#method-i-respond_with)? Penso che 'respond_with (@product)' ti avvicini se non esattamente quello che vuoi. [Esempio dal README di 'ActiveModel :: Serializer'] (https://github.com/rails-api/active_model_serializers#render-json). –
@PaulFioravanti Ma non è quello che sto cercando. Mi piacerebbe che il metodo 'show' rimanga vuoto mentre il generatore di Rails4 lo crea, ma per essere ancora in grado di usare Serializer come definito nella domanda (e non in jbuilder, come preferirebbe Rails). – zmilojko
@zmilojko Questa è una app per Rails 4.1? O un'app per rails-api? Come stai creando lo stato iniziale della tua app? – noel