2

我正在尝试在 Rails 4 项目中使用 ActionController::Metal 来制作 API“基础”控制器,如下所示:

# app/controllers/api/v1/base_controller.rb
class Api::V1::BaseController < ActionController::Metal
  include AbstractController::Rendering
  include ActionController::ImplicitRender
  include ActionController::Serialization
  include ActionController::MimeResponds
  include AbstractController::Callbacks
end

然后我在我的每个 API 控制器中都继承了这个,例如:

# app/controllers/api/v1/plans_controller.rb
class Api::V1::PlansController < Api::V1::BaseController
  def index
    @plans = Plan.all

    if params[:ids]
      @plans = @plans.where(id: params[:ids])
    end
  end

  def show
    @plan = Plan.find(params[:id])
  end

  private
    def plan_params
      params.require(:plan).permit(:name)
    end
end

我想用来ActiveModel::Serializers为我的 API 生成 JSON 响应,我创建了以下序列化程序:

# app/serializers/plan_serializer.rb
class PlanSerializer < ActiveModel::Serializer
  attributes :id, :name, :created_at, :updated_at
end

目前,undefined method 'each' for nil:NilClass当我尝试加载我的 API 端点 ( /api/v1/plans.json) 时出现错误 - 我认为 Metal 中缺少一些我需要使用序列化程序的东西,但我不确定是什么?!

4

1 回答 1

0

您必须在控制器方法中专门呈现您的模板。例如:

def show
  @plan = Plan.find(params[:id])
  render :show
end
于 2014-04-24T18:09:27.680 回答