🍣
[Rails]グループ機能の作成(ストロングパラメータ・ハッシュ)
グループ機能を作成しています!
ストロングパラメータは学習中でもずっと使用してるのに、いまだに苦手なのでまとめます!
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
は、指定されたキーだけを許可するメソッド。 - ここでは、
name
、image
、summary
の3つのキーだけを許可 している。 - これによって、悪意のあるユーザーが
group
に owner_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を使って、フォームから送られたデータを安全に受け取る
- シンボルを使って、オブジェクトとしてフォームから送られたデータを受け取る
参考文献
Discussion