はじめに
どうも初学者のかずです。
最近業務でrailsを触らせてもらってるので記事書いてみました。
初学者でも分かりやすいように書いたつもりです。
どうぞご覧ください~(/・ω・)/
paramsとは
paramsは、RailsにおいてHTTPリクエストから受け取ったパラメータを扱うための変数だよ。
Railsにおいて、HTTPリクエストに含まれる各種情報はすべてこのparamsという変数で扱うことができるんだ。
以下に、具体的なコードを使って、paramsについて分けて説明するよ。
1. paramsの基本的な使い方
paramsには、HTTPリクエストに含まれるクエリパラメーターやフォームデータなどがハッシュ形式で格納されてるんだ。
例えば、フォームで以下のようにデータを送信した場合、
<form method="POST" action="/articles">
<input type="text" name="article[title]" value="Hello, World!">
<textarea name="article[text]">This is my first post.</textarea>
<input type="submit" value="Create">
</form>
paramsには以下のようにデータが格納されるよ。
{
"controller" => "articles",
"action" => "create",
"article" => {
"title" => "Hello, World!",
"text" => "This is my first post."
}
}
このように、paramsにはコントローラーの名前やアクション名、そしてフォームデータが含まれるハッシュが格納されるんだ。
アクション内では、paramsを利用することで、フォームから受け取ったデータを取り出すことができるよ。
class ArticlesController < ApplicationController
def create
@article = Article.new(article_params)
# ...
end
private
def article_params
params.require(:article).permit(:title, :text)
end
end
article_paramsは、paramsからarticleというキーを持つハッシュを取り出し、その中からtitleとtextというキーを持つ値を取り出してるよ。
このように、paramsを安全に扱うために、必ずrequireとpermitを使用することが推奨されてるよ。
2. paramsの配列について
paramsには配列のデータを含めることもできるよ。
例えば、チェックボックスやセレクトボックスの値を配列で送信した場合、paramsには以下のように格納されるんだ。
{
"controller" => "products",
"action" => "index",
"category_ids" => ["1", "3", "5"]
}
このように、category_idsというキーに配列が格納されるね。
もっと詳しくpermitって何?
article_params メソッドは、Railsで一般的に使用されるStrong Parametersと呼ばれる機能の一部であり、
Rails 4から導入された機能らしいよ。
Strong Parametersは、パラメータハッシュをクリーンにするために使われるみたい。
ストロングパラメータは、パラメータのキーをフィルタリングするために使用されるよ。
フィルタリングされたキーとそれに関連する値が含まれた安全なパラメータハッシュを生成し、それ以外のキーは単に無視されるんだ。
この機能により、悪意のあるユーザーが意図しないパラメータを送信して、アプリケーションの動作を乱すことができなくなるね。
article_params メソッドでは、params に含まれるパラメータをフィルタリングして、必要なキーだけを取得することができるよ。
具体的には、:titleと:textという2つのパラメータが含まれている :article キーのみを取得してるね。
以下に、article_paramsメソッドがどのように動作するかを示すコードを示すよ。
def article_params
params.require(:article).permit(:title, :text)
end
上記のコードを実行すると、params ハッシュは :article キーを必須とするように指定されるんだ。
:article キーが存在しない場合、ActionController::ParameterMissing エラーが発生するよ。
params.require(:article) を実行すると、params から :article キーを取得するね。
その後、 .permit(:title, :text) を実行することにより、
params[:article] から :title と :text のキーのみをフィルタリングして許可するよ。
つまり、params の中にある :article キーに、:title と :text という2つのキーが存在しない場合は、エラーが発生するんだね。
例えば、params が以下のように渡された場合、article_params メソッドは { title: 'title', text: 'text' } を返すよ。
params = {
article: {
title: 'title',
text: 'text',
other_key: 'value'
}
}
article_params = params.require(:article).permit(:title, :text)
# => { title: 'title', text: 'text' }
permit以外のフィルタリング
Railsには、Strong Parametersを使ってフィルタリングする方法があるよ。
以下に、permit以外にもフィルタリングする方法を3つ紹介するね。
1. except
exceptを使うことで、指定したキーをパラメータから除外することができるよ。
def user_params
params.require(:user).except(:password_confirmation).permit(:name, :email, :password)
end
上記の例では、:password_confirmationというキーをパラメータから除外し、:name、:email、:passwordのキーを許可するよ。
2. slice
sliceを使うことで、指定したキーだけを残すことができるよ。
def user_params
params.require(:user).slice(:name, :email).permit(:name, :email, :password)
end
上記の例では、:nameと:emailのキーだけを残し、:passwordのキーを除外しているよ。
3. transform_keys
transform_keysを使うことで、キー名を変更することができるんだ。
def user_params
params.require(:user).transform_keys { |key| key.to_s.camelize(:lower) }.permit(:name, :email, :password)
end
上記の例では、キー名をキャメルケースからスネークケースに変換しているよ。
例えば、:userNameというキーがあった場合には、:user_nameというキーに変換されるんだ。
このように、transform_keysを使うことで、外部とのAPI通信時に必要な形式にパラメータを変換することができるね。
最後に
読んでくださりありがとうございました!
よかったらいいね!お願いします。
指摘もあればどんどんコメントお待ちしております(´・ω・`)