Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Railsのparams(パラメータ)とは?基本からStrong Parametersまで徹底解説

Rails開発において、ユーザーからのデータを受け取る仕組みであるparams(パラメータ)は、必ず理解しておきたい重要な概念です。この記事では、Railsパラメータの基本的な仕組みから、フォームやURLとの対応関係、セキュリティを守る「Strong Parameters」まで、実例を交えてわかりやすく解説します。

なぜparamsが必要なのか?

Webアプリケーションでは、ユーザーがサーバーへデータを送信する機会が数多くあります。Railsでは、ユーザーは主に以下の3つの方法でアプリケーションにデータを送ることができます。

  1. クエリパラメータを使う方法(例:example.com/?q=bacon
  2. フォームを送信する方法(例:/users/sign_in
  3. URL自体に含める方法(例:/books/1

これらのデータにRailsからアクセスするには、どうすればよいのでしょうか。答えはparamsです。

paramsの基本:コントローラでのデータ取得

コントローラのアクション内でparamsを呼び出すことで、フォームやURLクエリのデータにアクセスできます。

厳密には、paramsActionController::Parametersオブジェクトを返すメソッドですが、実際の挙動はハッシュ(Hash)と非常によく似ています。

たとえば、paramsから特定の値を読み取りたい場合は、次のように書きます。

params[:id]

値が存在すればその値が返り、存在しなければnilが返ります。

paramsを使う際に知っておくべきポイント

  • フォームのフィールドが空欄のまま送信された場合、空文字列("")が返されます(nilではない点に注意)
  • paramsの中の値はすべて文字列として扱われます。整数として送信された値でも、文字列になります

paramsの仕組みを正しく理解していないと、混乱や予期しないバグの原因になりかねません。ここからは、さらに詳しく見ていきましょう。

Railsの規約:フォームフィールドとparamsのマッピング

フォームの入力欄やURLパラメータは、どのようにparamsのキーに対応するのでしょうか。具体例で確認してみます。

次のようなシンプルな検索フォームがあるとします。このフォームは/searchに対してPOSTリクエストを送信します。

送信結果として得られるparamsオブジェクトは、次のようになります。

{ "q"=>"", "controller"=>"books", "action"=>"search" }

この"q"は何でしょうか。これはHTMLフォーム内のinput要素のname属性です。name属性の値は自由に決められます。

また、form_forヘルパーメソッドを使ってフォームを作成した場合、name属性は自動生成され、一定のパターンに従います。

たとえば、form_for(@book)にいくつかのフィールドを追加すると、次のようなHTMLが生成されます。

# book[title] のような形式のname属性が自動生成される

このbook[title]という形式のフィールド名により、値がネストされたparamsハッシュが生成されます。

ユーザーが空のフォームを送信した場合、次のようなデータを受け取ることになります。

{
  "book"=>
    {
      "title"=>"",
      "author"=>"",
      "cover"=>"",
      "language"=>"English"
    }
}

コントローラ側からは、次のようにしてデータにアクセスします。

params[:book][:language]
# => "English"

params[:book][:author]
# => ""

ここで重要なポイントがあります。paramsはハッシュのように振る舞いますが、通常のRubyハッシュと異なり、シンボルと文字列を同等のキーとして扱うという特徴があります。

つまり、params["book"]params[:book]はまったく同じ意味になります。

ルーティングでパラメータを受け取れるようにする

クエリパラメータ以外にも、RESTスタイルのパラメータを受け取れるように設定できます。Railsではこれを「動的セグメント(dynamic segment)」と呼びます。

たとえば、次のようなルート定義がある場合:

get 'books/:id', to: 'books#show'

または、リソースベースのルーティングを使っている場合:

resources :books

次のようなURLを使用できるようになります。

/books/1

このURLの中の1は、ルート定義におけるbooks/:id:id部分に該当し、params経由でアクセスできます。

params[:id]

これを利用すれば、ユーザーが求めている特定のリソースを簡単に検索できます。

Book.find(params[:id])

Strong Parameters(ストロングパラメータ)を理解する

次に、多くの開発者がつまずきやすいポイントを紹介します。オブジェクトをデータベースに保存しようとしたのに、うまく保存できない——そんなときは、まずRailsサーバーのログを確認してみてください。

次のようなログが出力されているかもしれません。

Unpermitted parameter: :language

これはどういう意味なのでしょうか。

Rails 4から導入された「Strong Parameters」は、セキュリティ対策のための仕組みです。この仕組みにより、データベースに保存できる属性をホワイトリスト形式で明示的に指定することが強制されます。

これにより、「マスアサインメント(Mass Assignment)」と呼ばれる脆弱性を防げます。マスアサインメントとは、悪意のあるユーザーが本来アクセス権のないフィールド(たとえばadmin = trueなど)を不正に書き換えられてしまう問題のことです。

許可するフィールドの指定方法

ホワイトリストへの登録は、次のようにprivateメソッドとして定義するのが一般的です。

def book_params
  params.require(:book).permit(:title, :author, :cover, :language)
end

それぞれのメソッドの役割は次のとおりです。

  • requireメソッド:params[:book]を探し、存在しない場合はエラーを発生させます
  • permitメソッド:保存を許可する属性(任意)のリストを指定します

その結果、許可された属性だけを含む新しいparamsハッシュが返され、安全にデータベースへ保存できるようになります。

Book.create(book_params)

注意:通常のRubyハッシュはチェックをバイパスする

一点注意しておきたいのは、通常のRubyハッシュを直接渡した場合、このセキュリティ機構は適用されないという点です。

Book.create(title: "", author: "", cover: "")

このような書き方でも問題ありませんが、それはauthorなどの属性名がコード内にハードコーディングされており、外部からの不正な入力が混入しないためです。ユーザー入力を扱う場合は、必ずStrong Parametersを通しましょう。

まとめ

この記事では、Railsのparamsについて、その仕組み、フォームやURLとの対応関係、そしてStrong Parametersによるセキュリティ対策までを学びました。

  • paramsはフォーム・クエリ・URLの3種類のデータにアクセスするための入り口
  • paramsはシンボルと文字列のキーを同等に扱える特殊なハッシュ風オブジェクト
  • 動的セグメント(:idなど)でRESTfulなURLからデータを取得できる
  • Strong Parametersで許可した属性だけを保存し、マスアサインメントを防ぐ

ぜひご自身のRailsプロジェクトで実際に手を動かして試し、ノートにまとめて復習してみてください。理解が一段と深まるはずです。


  1. Googleマップのプラスコードとは?確認方法と使い方を徹底解説

    Googleマップの「プラスコード(Plus Codes)」という言葉を耳にしたことはありますか?Googleマップで場所を表示した際に、意味不明な英数字のコードを目にして、何のためにあるのか不思議に思った人もいるかもしれません。この記事では、プラスコードが何なのか、その目的、そしてGoogleマップで実際に使う方法についてわかりやすく解説します。Googleマップのプラスコードとは?地球上のあらゆる地点は、緯度と経度の座標で特定できます。しかし、長い数字の羅列は必ずしも便利な場所の探し方ではありません。そこでGoogle社のチューリッヒ開発拠点は2014年、「オープンロケーションコード(Op

  2. Windows Sysinternalsとは?概要から使い方まで徹底解説

    自分のWindowsパソコンを完全にコントロールできたら素晴らしいと思ったことはありませんか?ほぼすべてのWindowsプロセスやアプリケーションの内部を覗き見できるだけでなく、アプリがアクセスしているファイルやレジストリエントリをリアルタイムで確認できるのは、実に魅力的な機能です。 Sysinternalsは、最も信頼性が高く強力なWindowsシステム管理ツールキットのひとつです。そのほとんどのユーティリティはシンプルなEXEファイルなので、USBフラッシュドライブに入れておけば、持ち運び可能なシステム管理ツールとしていつでも活用できます。 Windows Sysinternalsとは?