Я знаю, что при использовании шаблонов представлений (html, rabl) мне не нужен явный вызов рендеринга в моем действии контроллера, потому что по умолчанию Rails отображает шаблон с именем, соответствующим имени действия контроллера. Мне нравится эта концепция (не заботясь о рендеринге в моем коде контроллера), и поэтому мне интересно, возможно ли это также при использовании ActiveModel::Serializers?
Пример, это код из сгенерированного контроллера (Rails 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
и это сериализатор:
class ProductSerializer < ActiveModel::Serializer
attributes :id, :name, :description, :url, :quantity, :price
end
Нажимая /products/1.json, я ожидаю, что произойдут две вещи:
- Поля, не перечисленные в сериализаторе, следует опустить,
- Весь объект JSON должен быть инкапсулирован в поле верхнего уровня «продукт».
Однако этого не происходит, весь сериализатор игнорируется. Но тогда, если я изменю метод Show на следующее:
# 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
И теперь все хорошо, но я потерял пользу от фильтра before_action (и мне кажется, что у меня какой-то лишний код).
Как это должно быть сделано на самом деле?
respond_with
? Я думаю, чтоrespond_with(@product)
приблизит вас к тому, чего вы хотите. Пример изActiveModel::Serializer
README. - person Paul Fioravanti   schedule 18.04.2014show
оставался пустым, поскольку генератор Rails4 создает его, но по-прежнему мог использовать сериализатор, как определено в вопросе (а не jbuilder, как кажется, предпочел бы Rails). - person zmilojko   schedule 19.04.2014