【发布时间】:2013-07-11 13:23:06
【问题描述】:
我知道,当使用视图模板(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 过滤器的好处(在我看来,我有一些冗余代码)。
这应该怎么做?
【问题讨论】:
-
@zmilojko 你试过使用
respond_with吗?我认为respond_with(@product)会让你接近你想要的。 Example fromActiveModel::SerializerREADME. -
@PaulFioravanti 但这不是我所追求的。我希望
show方法在 Rails4 生成器创建它时保持为空,但仍然能够使用问题中定义的序列化程序(而不是 jbuilder,因为它似乎是 Rails 更喜欢的)。 -
@zmilojko 这是一个直接的 Rails 4.1 应用程序吗?还是一个 rails-api 应用程序?您是如何创建应用的初始状态的?
标签: ruby-on-rails-4 actioncontroller active-model-serializers