传递Rails从模型到控制器的错误消息

时间:2013-08-06 03:29:49

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我的模型中有一个解析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返回错误,我该如何重定向:返回我的控制器并刷新API返回的错误消息。我最初在我的控制器中有这个逻辑,但是为了测试目的将它移到我的模型中。

1 个答案:

答案 0 :(得分:3)

你的模型方法应该是:

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 .. rescue块来处理异常