web-dev-qa-db-ja.com

Rails強力なパラメーター-パラメーターを配列または文字列にすることができます

私のRailsコントローラーで強力なパラメーターを使用して、許可されたパラメーターがStringまたはArrayであるとどのように述べることができますか?

私の強いパラメータ:

class SiteSearchController < ApplicationController
    [...abbreviated for brevity...]

    private
    def search_params
        params.fetch(:search, {}).permit(:strings)
    end
end

POST文字列をStringまたはArrayとして検索したいのですが。

1つのものを検索するには:

{
    "strings": "search for this"
}

または、複数のものを検索するには:

{
    "strings": [
        "search for this",
        "and for this",
        "and search for this string too"
    ]
}

更新:

目的:ユーザーがリクエストを「バッチ処理」(web-hooks経由で応答を取得)したり、1回限りのリクエスト(即時応答を取得)したりできるAPIを作成しています。同じエンドポイント。この質問は私の要件のほんの一部です。

次の部分では、これと同じロジックを実行します。ここでは、複数のページで検索を実行できるようにします。

[
    {
        "page": "/section/look-at-this-page",
        "strings": "search for this"
    },
    {
        "page": "/this-page",
        "strings": [
            "search for this",
            "and for this",
            "and search for this string too"
        ]
    }
]

または単一ページ:

{
    "page": "/section/look-at-this-page",
    "strings": "search for this"
}

(これにより、Strong ParamsObjectまたはArrayの送信を許可する必要があります。

これは基本的なことのように思えますが、私はそこに何も見ていません。

strings paramを配列にして、配列に1つの値を含めるには、1つのものを検索する必要があることはわかっていますが、このパラメーターをそれよりも堅牢にしたいのです。

12
skplunkerin

params[:strings]は配列であり、そこから機能します

def strong_params
  if params[:string].is_a? Array
    params.fetch(:search, {}).permit(strings: [])
  else 
    params.fetch(:search, {}).permit(:strings)
  end
end
10
Eyeslandic

パラメータを2回許可できます。1回は配列用、もう1回はスカラー値用です。

def search_params
    params.fetch(:search, {}).permit(:strings, strings: [])
end
18
tombeynon