zer*_*sor 5 actioncontroller active-model-serializers ruby-on-rails-4
我知道在使用视图模板(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
Run Code Online (Sandbox Code Playgroud)
这是序列化器:
class ProductSerializer < ActiveModel::Serializer
attributes :id, :name, :description, :url, :quantity, :price
end
Run Code Online (Sandbox Code Playgroud)
点击/products/1.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
Run Code Online (Sandbox Code Playgroud)
现在一切都很好,但我已经失去了before_action过滤器的好处(在我看来,我有一些冗余代码).
这应该怎么做?
我们在第二个代码中看到的“冗余代码”只是这一行:
@product = Product.find(params[:id])
我相信这与您的 before_action 的逻辑相同。您不需要此行,只需将其删除即可。现在重复项已被删除。
到剩下的部分。一个动作需要知道要渲染什么。默认情况下,如果操作为空或不存在,respond_to则将查找并呈现相应的 'action_name'.html.erb (以及 指定的其他格式)。
这就是 Rails 4 生成器创建的内容起作用的原因:它创建show.html.erb和show.json.jbuilder并进行渲染。
使用 时ActiveModel::Serializer,您没有模板。如果将操作留空,它就不知道要渲染什么。因此,您需要告诉它@product通过以下任一方式将其呈现为 json:
render json: @product
或者
respond_with @product