2

私は美化しようとしている小さなシナトラAPIを持っています。私のルートのほとんどは単純なdb操作ですが、db操作を実行する前に外部サービスを呼び出す必要があるルートもあります。すべての場合において、サービス応答への応答方法を除いて、ほとんどのコードは同じです。洗練された関数型プログラミングのアプローチはありますか?

これらのルートの1つの例を次に示します。

  get '/update_x' do
    validateParams(params,:x)
    xid = params[:x]
    xName = getNameFromId(xid)

    if xName
      # Make request to proxy service
      rid = generateRandomHexNumber(16) # generate requestId
      params['m'] = 'set'
      params['rid'] = rid

      json = "{}"      
      begin
        response = @resource["/"+"?rid=#{rid}&id=#{xid}&json=#{json}"].get
        status = response.code
        body = response.body

        parsed_json = JSON(body)
        if parsed_json['response'] and parsed_json['response']['success'] and parsed_json['response']['success']=='false'
          msg = {:success => "false", :response => "unknown error"}
          if parsed_json['response']['response']
            msg = {:success => "false", :response => parsed_json['response']['response']}
          end
          content_type :json
          msg.to_json
        else

         #### Here is stuff specific to this api call

          updateDBHelper(xid,buildUpdateOptions(params))

          params['ss_status'] = status
          content_type :json
          params.to_json

          #### End specific to api call
        end 
      rescue Exception=>e
        params['ss_status'] = status
        params['exception'] = e
        content_type :json
        params.to_json
      end
    else
      msg = {:success => "false", :response => "Not found"}
      content_type :json
      msg.to_json
    end
  end
4

1 に答える 1

3

一般に、毎回変更される任意のコードを含む一般的なパターンがある場合、最も簡単なことは、それらのカスタマイズを含むブロックを受け入れることです。

def make_api_request(some, params)
  # do what you need to do
  yield(variables, that, your_custom_code, needs)
  # do some more, maybe cleanup
end

get '/some_route' do
  make_api_request do |variables, that, your_custom_code, needs|
    # do custom stuff here
  end
end
于 2012-05-21T23:25:07.933 に答える