【问题标题】:Custom URL Param for Rails REST APIRails REST API 的自定义 URL 参数
【发布时间】:2017-06-18 08:51:44
【问题描述】:

我有一个客户控制器来处理对属于公司的客户资源的请求。我希望能够通过 customer_idphone_number 同时GET customers。 默认的 GET 方法只能让我访问 customer_idcompany_id。 我应该如何修改我的路线才能管理它?

这是我的客户控制器

的代码
class Api::V1::CustomersController < ApplicationController
  respond_to :json

  def show
    customer_id = params[:id]
    mobile_number = params[:mobile_number]
    if mobile_number
      customer = Customer.find(mobile_number)
      render json: customer, status: 201
    else
      if customer_id
        customer = Customer.find(customer_id)
        render json: customer, status: 201
      else
        render json: { errors: "Customer ID and Phone Number is NULL" }, status: 422
      end
    end
  end
end

routes.rb 文件:

Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  # API routes path
  get '/', :to => redirect('/index.html')
  namespace :api, defaults: { format: :json } do
    namespace :v1 do
      resources :users, only: [:show, :create, :update, :index]
      resources :sessions, only:[:create, :destroy]
      resources :companies, only:[:create, :destroy] do
        resources :products
        resources :customers do
          resources :invoices
        end
        resources :categories do
          resources :products
        end
      end
      resources :products, only:[:create, :destroy]
    end
  end
end

【问题讨论】:

  • 客户的样品反应如何?你能告诉我们吗?
  • { "id": 1, "company_id": 1, "name": "john doe", "isActive": true, "created_at": "2j017-06-17T08:20:26.000 Z”,“updated_at”:“2017-06-17T08:20:26.000Z”,“移动”:0,“地址”:“”,“pan_number”:null,“tin_number”:null,“party_name”:“ " }
  • 它将是包含客户详细信息的 JSON 响应
  • 好的。那么你的控制器代码有什么问题?

标签: ruby-on-rails json rest ruby-on-rails-5


【解决方案1】:

默认的 GET 方法只能让我访问 customer_id 和 company_id。

实际上它定义了参数的名称,但是您可以随意使用它;在您的情况下,您可以在 idmobile_number 中使用 params[:id] 进行搜索,例如:

class Api::V1::CustomersController < ApplicationController
  respond_to :json

  def show
    customer = Customer.find_by(mobile_number: params[:id])

    if customer.empty?
      customer = Customer.find(params[:id])
    end

    if customer.present?
      render json: customer, status: 201
    else
      render json: { errors: "Customer ID and Phone Number is NULL" }, status: 422
    end
  end
end

因此,您可以在 api 调用中使用 idmobile_number;例如,使用id:

api/v1/companies/customer/1

或者,使用mobile_number

api/v1/companies/customer/55555555

这里唯一的问题是,如果id 是一个数字而mobile_number 只有数字,那么您最终可能会拥有一个params[:id],它会找到一个Customer 同时具有id 和@ 987654336@;它将返回mobile_number找到的Customer

如果这代表一个问题,那么您可能会收到命名参数(通过查询字符串)和类似的设置1 就像您的控制器上当前的设置一样,只需修复使用 @ 时查询 Customer 的方式987654340@:

class Api::V1::CustomersController < ApplicationController
  respond_to :json

  def show
    customer_id = params[:id]
    mobile_number = params[:mobile_number]

    if mobile_number
      customer = Customer.find_by(mobile_number: mobile_number)
    else
      customer = Customer.find(customer_id)
    end

    if customer.present?
      render json: customer, status: 201
    else
      render json: { errors: "Customer ID and Phone Number is NULL" }, status: 422
    end
  end
end

然后你只需要修改你的路由来改变getcustomers的默认值:

resources :customers, except: [:show] do
  resources :invoices
  get '/customer', to: `customer#show'
end

并且api调用应该指定被调用的参数;比如求id

api/v1/companies/customer?id=1

mobile_number:

api/v1/companies/customer?mobile_number=55555555

1我稍微更改了逻辑以说明作为参数提供但在 customers 表中不存在的有效 idmobile_number p>

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2019-04-07
    • 2017-09-23
    • 2016-05-24
    • 1970-01-01
    • 2015-11-07
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多