第31回 Railsのストロングパラメータ: permitとmergeの使い分け

Railsアプリケーションにおいて、コントローラーでパラメータを扱う際のセキュリティは極めて重要です。ストロングパラメータは、不正なマスアサインメントを防ぎ、アプリケーションを保護するためのメカニズムです。主に**permitmerge**の二つのメソッドが使われます。

permitメソッド

**permit**メソッドは、許可されたフィールドのみをコントローラー内で安全に使えるようにするために使用されます。これにより、フォームを通じてユーザーが送信できるパラメータを厳格に制限することができます。

例えば、部屋を作成する際には部屋の名前と関連するユーザーIDが必要です。以下のように**permit**メソッドを使用して、これらのパラメータを許可します。


def room_params
  params.require(:room).permit(:name, user_ids: [])
end

このコードでは、**:nameuser_idsの配列を許可しています。user_ids**の配列は、部屋にアサインされるユーザーをチェックボックスなどで選択した場合に使われることが多いです。

mergeメソッド

一方で、**merge**メソッドはフォーム外のデータをストロングパラメータに安全に追加するために使われます。これは主に、フォームには存在しないが、サーバー側で処理が必要なパラメータを追加する場合に便利です。

例えば、メッセージを作成する際には、ログイン中のユーザーのIDをメッセージと関連づける必要がありますが、これはフォームを通じて送信されるべきではありません。セキュリティを考慮して、サーバー側で**current_user**を利用してこの情報を追加します。


def message_params
  params.require(:message).permit(:content).merge(user_id: current_user.id)
end

この方法により、**:contentというキーでフォームから送信されたデータを許可し、user_idcurrent_user**のものとして明示的にセットします。これにより、ユーザーは自分のIDを直接送信したり、操作したりすることができなくなり、サーバー側で正確なユーザーIDをメッセージに関連付けることが保証されます。

まとめ

ストロングパラメータを使用することで、Rails開発者はアプリケーションの安全性を維持しながら、ユーザーからのデータを柔軟に扱うことができます。**permitはフォームからのデータを許可するために、merge**はフォーム外のデータを安全に追加するために使用します。これにより、ユーザー入力を適切に制御し、アプリケーションを安全に保つことが可能になります。