2

JSONAPI でさまざまなリソースを返すことができる /search API をどのように実装しますか?

GET /search?q=londonauthorたとえば、「Jack London」のbookリソースと「London: The Novel」のリソースを返すことができます

includeとresourcessearchを返すリソースを実装することから始めましたが、JSONAPI に従うには、API を次のようにリファクタリングする必要があります。bookauthorGET /search?filger[q]=london

この (非常に一般的な) ユースケースは、JSONAPI では実際には対処されていないと感じています。

私の最終的な目標は、JSONAPI::Resources を使用した Rails バックエンドと、ember-data を使用した ember アプリでこれを実装することです。

あなたのアドバイスは何ですか?

4

2 に答える 2

0

シリアル化に使用したいリソースを指定できるように、 jsonapi-utils gemを使用して手動で行うことができます。

jsonapi_serializeメソッドで:

class SearchesController < BaseController
  def index
    results = MySearchEngine.search(params)
    render json: jsonapi_serialize(results, options: { resource: UserResource })
  end
end

または高レベルのjsonapi_render方法:

class SearchesController < BaseController
  def index
    results = MySearchEngine.search(params)
    jsonapi_render json: results, options: { resource: UserResource }
  end
end

それが役に立てば幸い。

于 2015-12-29T00:31:31.807 に答える
0

これが私がしたことです:

# config/routes.rb
resource :search, only: [:show]

# app/controllers/searches_controller.rb
def show
  render json: Search.new(params).as_json
end

# app/classes/search.rb
class Search
  def initialize(params = {})
    @results = [
      Author.where(name: params[:q]),
      Book.where(title: params[:q]),
    ].flatten
  end

  def as_json
    serialized_resources =
      @results.map do |result|
        resource = JSONAPI::Resource.resource_for(result.model_name.singular)
        serializer = JSONAPI::ResourceSerializer.new(resource)
        serializer.serialize_to_hash(resource.new(result, nil))[:data]
      end
    { data: serialized_resources }
  end
end

確かに、もっと良い方法はありますか?

于 2016-05-25T19:26:05.903 に答える