我正在尝试使用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的新手。
答案 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