我知道在使用视图模板(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 过滤器的好处(在我看来,我有一些冗余代码)。
这应该怎么做?