【问题标题】:Rails app - how to add a query parameter in API get request?Rails 应用程序 - 如何在 API 获取请求中添加查询参数?
【发布时间】:2016-12-19 01:09:39
【问题描述】:

我有一个简单的项目模型和“/items”以及“/items.json”工作。但是我想在 API 调用中添加一个搜索参数,如“/items.json?skuid=123”,返回的 json 将只有 skuid=123 的项目。

我尝试了以下方法:

class ItemsController < ApplicationController
  before_action :set_item, only: [:show, :edit, :update, :destroy]

  # GET /items
  # GET /items.json
  def index
    Rails.logger.debug("index.params=#{params}")
    @items = Item.all(params.slice(*Item.attribute_names))
  end

但是报错了

参数数量错误(给定 1,预期为 0)

请指教。

【问题讨论】:

  • 我认为您必须先检查skuid 参数是否存在,然后才能使用活动记录where 像这样Item.where("skuid=?",params[:skuid])
  • 谢谢。部分成功。 "/items.json?skuid=123" 感谢您的建议。我收到了 skuid 为“123”但现在“/items.json”返回空 json 的项目。之前它用于从数据库中返回所有项目。你能建议吗?
  • 使用 if 块来处理搜索项,你已经完成了
  • 如果您有任何问题,请告诉我

标签: ruby-on-rails json ruby-on-rails-4


【解决方案1】:

我会将您的代码重构为范围。

在您的Item 模型中:

class Item < ActiveRecord::Base
  scope :by_sku_id, -> (sku_id) { where(sku_id: sku_id) if sku_id.present? }
end

然后在您的Item 控制器中:

def index
  @items = Item.by_sku_id(params[:sku_id])
end

这减轻了担心您的参数是否在控制器内部设置的问题;整体简化控制器代码。您还可以链接这些范围并保持您的 API 灵活。

【讨论】:

  • 这行得通!我必须阅读范围以了解您在那里做了什么。它的优雅。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2021-06-04
  • 2021-09-12
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多