Active AdminのControllerでは、Strong Parameters のメソッド名は permitted_params だった

Rails の Controller で Strong Parametersを使う場合、 ***_params というプライベートメソッドを定義しています。

一方、Active Admin の Controller で Strong Parameters を使う時は、デフォルトだとどんな名前になるのかを調べた時のメモです。

 
目次

 

環境

  • Rails 6.1.4
  • Active Admin 2.9.0

 

permitted_params で取り出せた

公式ドキュメントにありました。
Setting up Strong Parameters | Active Admin | The administration framework for Ruby on Rails

permit_params で定義した項目は、 permitted_params から取り出せます。

 
そこで、前回の記事で使ったActive Adminのコードを一部修正し、

ActiveAdmin.register Fruit do
  permit_params :name, :color  # 定義

  # コントローラのcreate/update/destroyをオーバーライド
  controller do
    def create
      super do |format|
        # Strong Parameters から取り出し
        call_api_with_params(permitted_params[:fruit][:name])
      end
    end

    def call_api_with_params(name)
      logger.info("======> call api with #{name}")
    end
  end
end

のように、

  • create メソッドをオーバーライド
  • createメソッドの中で、StrongParametersの name を使ってAPIを呼ぶ
    • 今回はログに出力するだけ

な実装としました。

そして、Active Adminの画面で

  • name: ぶどう
  • color: #b46fe2
  • start_of_sales: 2021/7/19 00:04

の値を入力して保存します。

すると、ログには

Started POST "/admin/fruits" for 127.0.0.1 at 2021-07-19 00:04:11 +0900
Processing by Admin::FruitsController#create as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "fruit"=>{"name"=>"ぶどう", "color"=>"#b46fe2", "start_of_sales(1i)"=>"2021", "start_of_sales(2i)"=>"7", "start_of_sales(3i)"=>"19", "start_of_sales(4i)"=>"00", 
...
Unpermitted parameters: :start_of_sales(1i), :start_of_sales(2i), :start_of_sales(3i), :start_of_sales(4i), :start_of_sales(5i)
======> call api with ぶどう

と出力されました。

permitted_params[:fruit][:name]ぶどう が取り出せていました。

 

permitted_paramsのオーバーライド

Active Adminのデフォルトでは permit_params にて制御しています。

ただ、何らかの理由によりStrong Paramterの値を変更したい場合は、 permitted_params メソッドをオーバーライドします。

例えば

ActiveAdmin.register Fruit do
  permit_params :name, :color

  # コントローラのcreate/update/destroyをオーバーライド
  controller do
    # ...

    def permitted_params
      params.permit(:fruit => [:name])

      # 以下の書き方だとエラーになる
      # param is missing or the value is empty: fruit
      # params.require(:fruit).permit(:name)
    end

# ...

のようにすると、ログには

Unpermitted parameters: :color, :start_of_sales(1i), :start_of_sales(2i), :start_of_sales(3i), :start_of_sales(4i), :start_of_sales(5i)
Unpermitted parameters: :authenticity_token, :commit
{"fruit"=>#<ActionController::Parameters {"name"=>"ぶどう"} permitted: true>}
======> call api with ぶどう

のように出力されました。

Active Adminの結果も、以下のように color の値が入りませんでした。

 
なお、上記以外の書き方については、Active Adminのドキュメントや、Inherited ResourcesのREADMEにも記載がありました。

 

ソースコード

Githubに上げました。
https://github.com/thinkAmi-sandbox/rails_with_active_admin_app

関係するプルリクはこちらです。
https://github.com/thinkAmi-sandbox/rails_with_active_admin_app/pull/2