索引被调用而不是显示

时间:2017-08-08 11:54:39

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-3.1

我正在尝试使用Ruby on Rails编写API。在我的控制器类中, index 方法被调用而不是 show 。虽然我传递参数。

尝试了这些网址

http://localhost:3000/api/v1/quatertodate/?invoiceStatus=PENDING
http://localhost:3000/api/v1/quatertodate/PENDING
http://localhost:3000/api/v1/quatertodate/:PENDING

在上述所有情况下,我的 index 方法被调用而不是 show

各个控制器类

module Api
module V1
    class QuatertodateController < ApplicationController

        def index   
            invoices = Invoice.select("*").where("invoiceDate >= ?", @@present_date-90)
            render json: {status: 'SUCCESS', messasge: 'LOADED QUATERLY INVOICES', data: invoices}, status: :ok
        end

        def show
            invoices1 = Invoice.select("*").where("invoiceStatus== ? AND invoiceDate >= ?", params[:invoiceStatus], @@present_date-90)
            #invoices1 = Invoice.find(params[:invoiceStatus])
      #invoices1=Invoice.select("*").where("invoiceStatus= ? and invoiceDate >= ?", params[:invoiceStatus], @@present_date-180)
            render json: {status: 'SUCCESS', messasge: 'LOADED QUATERLY INVOICES', data: invoices1}, status: :ok
        end

    end
end

注意:评论部分 #invoices1 也不起作用。抛出:

<ActiveRecord::RecordNotFound: Couldn't find Invoice with 'customerId'=>

模式

create_table "invoices", primary_key: "customerId", id: :integer, default: nil, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "customerNumber", limit: 12
t.string "customerType", limit: 5
t.string "invoiceType", limit: 5
t.decimal "invoiceAmt", precision: 65, scale: 30
t.string "invoiceStatus", limit: 12
t.datetime "invoiceDate"

可能的 invoiceStatus :BILLED或PENDING

路由

Rails.application.routes.draw do
namespace 'api' do
    namespace 'v1' do
        resources :invoices
        resources :monthtodate
        resources :quatertodate
        resources :yeartodate
    end
end
end

佣金路线 Definitive Guide to the ARM Cortex-M3

我的目标:要退回发票状态为待定的过去90天内的发票。
我也尝试了更新方法来获取 PATCH 请求,而不是 show 但是它会抛出此错误

  

AbstractController :: ActionNotFound:找不到Api的动作'更新':

删除 index 方法会出现以下错误:

  

ActiveRecord :: RecordNotFound:找不到'customerId'=&gt;的发票“

我错过了什么?谁能指引我走向正确的方向?我找不到任何相关的文档。

我是Ruby on Rails的新手。

2 个答案:

答案 0 :(得分:1)

如果您要遵循正确的Rails和REST约定,则不会使用show操作。 show用于显示一条记录,并使用此格式api/v1/quartertodate/:id的网址进行调用,其中:id是您要显示的记录的id的动态变量。在控制器中,它可以params[:id]

index用于显示许多记录,即使它们不是所有记录。

您可以在索引操作中使用if...else分支处理此问题。

def index   
  @invoices = if params[:invoiceStatus].present?
    Invoice.where("invoiceStatus = ? AND invoiceDate >= ?", params[:invoiceStatus], ninety_days_past)
  else
    Invoice.where("invoiceDate >= ?", ninety_days_past)
  end

  render json: {status: 'SUCCESS', messasge: 'LOADED QUATERLY INVOICES', data: @invoices}, status: :ok
end

def show
  @invoice = Invoice.find(params[:id])
  render json: {status: 'SUCCESS', messasge: 'LOADED INVOICE', data: @invoice}, status: :ok
end

private

def ninety_days_past
  Date.today - 90
end

注意:您不需要select('*'),并且您应该为@invoices使用实例变量,因为如果您切换到JSON API的模板引擎,则需要更少的重构。此外,您今天不需要全局变量,只需使用内置的Date库并执行Date.today。要查找90天前的日期,您可以创建一个私有方法ninety_days_past,这样您就不会复制代码。如果您希望在每个控制器中使用此方法,只需直接在ApplicationController 中定义该方法,而不是您的QuatertodateController

答案 1 :(得分:0)

此网址将重新执行索引操作:

 http://localhost:3000/api/v1/quatertodate?invoiceStatus=PENDING

Route next将字符串?invoiceStatus = PENDING 标识为id参数。所以它会请求演出动作。

http://localhost:3000/api/v1/quatertodate/?invoiceStatus=PENDING