🍣

[Rails]グループ機能の作成(ストロングパラメータ・ハッシュ)

2025/02/04に公開

グループ機能を作成しています!
ストロングパラメータは学習中でもずっと使用してるのに、いまだに苦手なのでまとめます!


group_params メソッド

ストロングパラメータを使用して、params から特定の属性のみを許可し、意図しないパラメータの変更を防ぐ仕組み。

このメソッドを使うことで、フォームから送られたデータのうち、安全なものだけを受け取る ことができる。

private
def group_params
    params.require(:group).permit(:name,:image,:summary)
end

① params.require(:group)

params.require(:group)
  • params は、フォームなどから送られてくるパラメータ(データ)が入るハッシュのようなオブジェクト。
  • require(:group) は、params の中に group というキーが含まれていることを保証 する。
    • 例: { group: { name: "My Group", image: "image.png", summary: "Description" } }
    • もし group がないと、ActionController::ParameterMissing というエラーが発生する。

② .permit(:name, :image, :summary)

.permit(:name, :image, :summary)
  • permit は、指定されたキーだけを許可するメソッド。
  • ここでは、nameimagesummary の3つのキーだけを許可 している。
  • これによって、悪意のあるユーザーが groupowner_id や admin フラグ などの危険なデータを含めても、受け取らないようにする。

:name, :image, :summary の :(コロン)について

コロン(:)は Ruby のシンボル(symbol) を表している。

シンボルとは?

シンボルは、Ruby の内部では同じシンボルは常に同じオブジェクトとして扱われる
そのため、メモリ効率が良い


文字列とシンボルの違い

①シンボルは同じオブジェクトIDを持つ。

# 文字列
"hello" == "hello" # true (文字列は同じ内容なら等しい)
"hello".object_id == "hello".object_id # false (毎回異なるオブジェクト)

# シンボル
:hello == :hello # true (シンボルは同じものなら常に同じオブジェクト)
:hello.object_id == :hello.object_id # true (シンボルは1つしか作られない)
  • 文字列は、作成されるたびに新しいオブジェクトが生成される
  • シンボルは、一度作られると、プログラムの実行中はずっと同じオブジェクトIDを持つ

このため、シンボルはハッシュのキーとしてよく使われる

②シンボルはメモリ効率がいい

10000.times { "banana" }
10000.times { :banana }
  • 上のコードでは、"banana" は毎回新しいオブジェクトが作られるため、メモリを多く消費してしまう。
  • 2個目のコードは、:banana は最初に1回作成されるだけで、その後は同じオブジェクトを参照するため、メモリ効率が良い。

③ハッシュのキーとして使うと高速

文字列をキーにした場合

hash = { "name" => "Alice", "age" => 25 }
puts hash["name"]

シンボルをキーにした場合

hash = { name: "Alice", age: 25 }
puts hash[:name]
  • 文字列キー "name" の場合、Rubyは 比較のたびに新しい文字列オブジェクトを生成 して == で比較するため、処理が遅くなる。
  • シンボルキー :name の場合、オブジェクトIDで直接比較できる ため、高速。

まとめると

今回書いたコードは

  • paramsを使って、フォームから送られたデータを安全に受け取る
  • シンボルを使って、オブジェクトとしてフォームから送られたデータを受け取る

参考文献

https://docs.ruby-lang.org/ja/latest/class/Symbol.html
https://qiita.com/yyykms123/items/6a6ae7fe8cd9263a3d1c
https://qiita.com/yyykms123/items/2ceaec214f1f8a514011
https://qiita.com/Kta-M/items/53a13ef60e14fcb41193

Discussion