#coding: utf-8 module Ns module ControllerServicable def index @result = paginate(params) do |start, page_size| get_page_data(start, page_size, params) end render :json=>ResultPacker.data(@result.as_json) end #return [total_count, page_data] #可在子类中覆盖定制 def get_page_data(start = 0, size = 10, params = {}) where_conds = if @conds.present? @conds else query_conditionize(params, @conds) end logger.debug "====>conds: #{where_conds.inspect}" conds = {:conditions=>where_conds} total_count = model_class.count(conds) page_params = conds.merge!(:offset=>start, :limit=>size, :order=>params[:order]) page_data = model_class.all(page_params) [total_count, page_data] end def query_conditionize(params = {}, conds = {}) #清除空条件 params.delete_if{|k, v| v.blank? } #TODO 有@conds时如何融入??? #hash结构 conds = model_class.db_hashize(params) end #分页方法 # 加入文档说明 def paginate(params = {}) current_page = params[:current_page].to_i current_page = current_page < 1 ? 1 : current_page page_size = params[:page_size].to_i page_size = page_size <= 0 ? 10 : page_size page_size = page_size > 250 ? 250 : page_size offset = (current_page-1)*page_size #返回总数和当前页数据 起始位置, 数量 total_count, page_data = yield(offset, page_size) { :total_size=>total_count, :page_size=>page_size, :current_page=>current_page, :page_from=>offset + 1, :page_to=>offset + page_data.size, :page_items=>page_data } end #查找单条记录 def show @_obj = model_class.find(params[:id]) render :json=>ResultPacker.data(@_obj.as_json) end #创建记录 def create @_obj = model_class.new_from_buz(params[:data]) if @_obj.save render :json=>ResultPacker.data(@_obj) else render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash))) end end #更新记录 def update @_obj = model_class.find(params[:id]) if @_obj.update_from_buz(params[:data]) render :json=>ResultPacker.data(@_obj) else render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash))) end end #get a new buz obj with db default value def new_buz_obj @_data = model_class.buz_hashize render :json=>ResultPacker.data(model_class.name.underscore.to_sym=>@_data) end #get the mapping info def field_mapping @_data = model_class.mapping.data render :json=>ResultPacker.data(:field_mapping=>@_data) end #动态查看该模块发布接口列表 def interfaces @routes = Rails.application.routes.routes #TODO 写一个像rails info一样的那种内置controller respond_to do |format| format.html #interfaces.html.erb format.json {render json: @routes.map{|r| r.path}} end end protected #验证错误回传 def valid_errors(error_hash={}) (error_hash||{}).each{|k, v| error_hash[k] = v.join(', ') if v.is_a? Array } end end end