索引被调用而不是显示

index is getting called instead of show

我正在尝试使用 Rails 上的 Ruby 编写 API。在我的控制器中 class 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

各自的控制者class

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

耙路

我的 objective: 至 return 最近 90 天的发票,其发票状态为待处理。
我也尝试了 update 方法 PATCH 请求,而不是 show 但它抛出了这个错误

AbstractController::ActionNotFound: The action 'update' could not be found for Api:

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

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

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

我是 Rails 上 Ruby 的新手。

此 url 将重新请求索引操作:

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

Route 接下来将字符串 ?invoiceStatus=PENDING 标识为 id 参数。所以它会请求显示动作。

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

如果您要遵循正确的 Rails 和 REST 约定,则不会为此使用 show 操作。 show是显示一条记录,用URL这种格式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 使用实例变量,因为如果您为 [=] 切换到模板引擎,它将需要更少的重构39=] API。此外,您不需要今天日期的全局变量,只需使用内置的 Date 库并执行 Date.today。要查找 90 天前的日期,您可以创建一个私有方法 ninety_days_past,这样您就不会重复代码。如果您希望在每个控制器中使用此方法,只需直接在您的 ApplicationController 中定义该方法,而不是 您的 QuatertodateController.