索引被调用而不是显示
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
.
我正在尝试使用 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
.