使用ActiveModel :: Serializer为jQuery DataTable呈现JSON

时间:2016-08-05 22:14:42

标签: ruby-on-rails datatables active-model-serializers

我正在尝试将我的rails应用程序中的索引视图转换为使用jQuery数据表,使用服务器端数据处理来搜索,排序和分页记录集,这些记录集将由ActiveModel :: Serializer

呈现

DataTable需要一个如下所示的JSON对象:

{ 
  draw: 1,
  iTotalRecords: @records_count,
  iTotalDisplayRecords: @records_filtered_count,
  sEcho: params[:sEcho],
  aaData: [ 
    [ <column 1 value>, <column 2 value>, etc ],
    [ <column 1 value>, <column 2 value>, etc ],
    ...
  ]
}

目前我在名为index.json.haml的视图模板中呈现它。它看起来像这样:

= raw({ draw: 1,
  iTotalRecords: 1000,
  iTotalDisplayRecords: 100,
  sEcho: params[:sEcho],
  aaData: [ 
    [ <column 1 value>, <column 2 value>, etc ],
    [ <column 1 value>, <column 2 value>, etc ],
    ...
  ] }.to_json)

我试图在序列化程序中执行此JSON渲染,以便我可以摆脱视图模板,只需将以下内容添加到我的控制器中:

def index
  respond_to do |format|
    format.html
    format.json do
      render json: @my_objects, serializer: MyObjectsSerializer
    end
  end
end

到目前为止,这是我的序列化程序的样子:

class AssetDetailTitlesSerializer < ActiveModel::Serializer

  attributes :draw, :iTotalRecords, :iTotalDisplayRecords, :sEcho, :aaData

  def draw
    1
  end

  def iTotalRecords
    1000
  end

  def iTotalDisplayRecords
    100
  end

  def sEcho
    'what is this'
  end

  def aaData
    object.map do |my_object|
      [
        my_object.<column 1 getter>,
        my_object.<column 2 getter>,
        etc.
      ]
    end
  end
end

当然我会为iTotalRecords等提供真正的价值,但我的主要问题是我调用助手来生成每个字段中的内容 - 例如,一列是需要调用的链接rails path / url helper。其他列调用帮助程序,突出显示与搜索查询匹配的文本。 这些帮助程序在序列化程序中不可用,并且还调用params,这在视图/控制器之外没有意义。

我的问题是所有这些查看帮助程序的调用都纠缠在我的序列化程序代码中。当我在index.json.haml中呈现JSON时,这不是问题,因为视图逻辑属于那里。所以我的问题是:这是否很好地使用了序列化器?我的目标是清理我的观点和控制器,但是现在我把混乱推到了另一个对象,它会变得更加混乱(假设我可以让它完全工作)

0 个答案:

没有答案