0

モデルに、API をパーサーしてデータを返すメソッドがあります。

def self.get_item_info(date, time, limit)
    url = URI.parse("#{end_point_url}/#{date}?mRange=#{time}&limit=#{limit}") 
           @response = JSON.parse(Net::HTTP.get_response(url).body)
           if @response["ERROR"]
             flash[:notice] = { :notice => "Sorry, No Data returned. Message: #{@response["ERROR"]["errorMessage"]}" }
           else
             @data = []
             @items = @response["v1"]["items"]
             @items.each do |item|
               add_data(item["itemNbr"])
               @data << [@fam_id = item["FamId"],
               @item_nbr = item["itemNbr"],
               @item_desc = item["itemDesc"]]
              end
              return @data
      end    
 end

私のコントローラー:

def index
    if
      date = params[:date]
      time = params[:time]
      limit = params[:limit].to_i

        Product.get_item_info(date, time, limit)
        if @message
          redirect_to "/view_api", :flash => { :notice => "Sorry, No Data returned. Message: #{@message}" }
        else 
          @data 
        end
      end
  end

API からエラーが返された場合、コントローラーで :back をリダイレクトし、API から返されたエラー メッセージをフラッシュするにはどうすればよいですか。最初はコントローラーにこのロジックがありましたが、テスト目的でモデルに移動しました。

4

1 に答える 1

5

モデルメソッドは次のようになります。

def self.get_item_info(date, time, limit)
       url = URI.parse("#{end_point_url}/#{date}?mRange=#{time}&limit=#{limit}") 
       response = JSON.parse(Net::HTTP.get_response(url).body)
       if response["ERROR"]
        return [nil, { :error => "Sorry, No Data returned. Message: #{response["ERROR"]["errorMessage"]}" }]
       else
         data = []
         items = response["v1"]["items"]
         items.each do |item|
           add_data(item["itemNbr"])
           data << [fam_id = item["FamId"],
           item_nbr = item["itemNbr"],
           item_desc = item["itemDesc"]]
          end
          return [data,{ :success => "true" }] 
  end    
end

次に、コントローラーで:

def index
  date = params[:date]
  time = params[:time]
  limit = params[:limit].to_i

    @data, @message = Product.get_item_info(date, time, limit)
    if @message[:error].present?
      redirect_to "/view_api", :flash => { :notice => @message[:error] }
    else 
      @data 
    end
  end
end

構文エラーまたは論理エラーがないか確認してください。道を示しただけです。

ノート:

理由なくインスタンス変数を使用しないでください。特にモデルで。特定のエラー メッセージを気にしない場合は、モデルで例外を発生させ、コントローラーで begin .. レスキュー ブロックを使用して例外を処理できます。

于 2013-08-06T04:13:28.337 に答える