はじめに
さっき、Qiitaに「Railsのコントローラに出てくるparamsはハッシュじゃない」というタイトルの記事を公開しました。
それからふと、「これと同じテーマでChatGPTに記事を書かせたらどうなるんだろうか?」と思ったのでちょっと試してみました。
実行条件
使ったのはChatGPT 3.5です。 最初は以下のようにお願いしました。
「Railsのコントローラに出てくるparamsはハッシュじゃない」というタイトルで初心者向けのわかりやすい解説記事を書いてください。
最初に生成された記事には、僕の書いたトピックがいくつか含まれてなかったので追加で以下のお願いをしました。
以下のようなトピックも記事に含めてほしいです。
- paramsで参照しているのは変数ではなく、メソッド
- ハッシュではないのでparamsから値を取り出すときはシンボルでも文字列でもOK
が、「paramsで参照しているのは変数ではなく、メソッド」の内容が僕の期待している内容と違ったので次のお願いもしました。
「paramsで参照しているのは変数ではなく、メソッド」ではparamsがローカル変数ではなくコントローラ内にメソッドとして定義されていることを初心者向けに説明してほしいです。
その結果出力されたのが以下の内容です。(全文をそのままコピペします)
Railsのコントローラに出てくるparamsはハッシュじゃない
初めてRailsを学び始めると、コントローラでよく見かけるparams
というキーワードに遭遇することでしょう。しかし、実際にはparams
は単なるハッシュではなく、少し特殊な仕組みが組み込まれています。
1. paramsって何?
まず最初に、params
が何を指しているのかを理解しましょう。params
はRailsアプリケーションに送られてきたHTTPリクエストのパラメーターを受け取るための仕組みです。これには、フォームから送信されたデータやURLパラメーターなどが含まれます。
# コントローラ内でのparamsの使用例 def create user = User.new(user_params) # 他の処理... end private def user_params params.require(:user).permit(:name, :email, :password) end
上記の例では、create
アクション内でparams
を使用して新しいユーザーを作成しています。user_params
メソッドでは、params
から必要な情報を取り出すためのフィルタリングも行っています。
2. paramsはハッシュじゃない?
一見すると、params
はハッシュのように見えるかもしれませんが、実際にはActionController::Parameters
と呼ばれるクラスのインスタンスです。これはRailsが提供する特殊なクラスで、通常のハッシュとは異なる性質を持っています。
2.1 ハッシュとの違い
通常のハッシュでは、どんなキーでも受け入れますが、ActionController::Parameters
は許可されたキー以外のアクセスを拒否します。これにより、予期せぬパラメーターがコントローラに渡されることを防ぎます。
# 通常のハッシュ normal_hash = { name: "John", age: 25 } puts normal_hash[:gender] # => nil # ActionController::Parameters params = ActionController::Parameters.new(name: "John", age: 25) puts params[:gender] # => ActionController::UnpermittedParameters (found unpermitted parameters: :gender)
2.2 ストロングパラメーター
この特性は、セキュリティやデータ整合性を維持するために非常に役立ちます。上記の例で示したuser_params
メソッドが、実際にはストロングパラメーターとして知られているものです。これにより、許可されたパラメーターだけが新しいユーザーオブジェクトに反映され、不正なデータが混入することを防ぎます。
3. paramsで参照しているのは変数ではなく、メソッド
params
で参照しているのは変数ではなく、コントローラ内で定義されたメソッドです。このメソッドはHTTPリクエストから送られてきたパラメーターを取り出し、必要な情報を抽出します。例えば、以下のようなメソッドがあります。
# コントローラ内でのparamsの使用例 def create user = User.new(user_params) # 他の処理... end private def user_params params.require(:user).permit(:name, :email, :password) end
上記の例では、user_params
メソッドがparams
から必要な情報だけを取り出しています。このメソッドはコントローラ内で利用でき、params
をより使いやすく、かつ安全に扱うための手段となります。
4. ハッシュではないのでparamsから値を取り出すときはシンボルでも文字列でもOK
通常のハッシュではキーにはシンボルか文字列を指定する必要がありますが、ActionController::Parameters
は柔軟で、キーを指定する際にシンボルでも文字列でも良いです。
# ActionController::Parameters params = ActionController::Parameters.new(name: "John", age: 25) puts params[:name] # => "John" puts params["age"] # => 25
params
はこのような柔軟性を提供するため、開発者が使いやすくなっています。
5. まとめ
params
はRails開発において重要な要素であり、ハッシュとは異なる特殊な性質を持っています。理解することで、安全で効果的なコードを書く手助けとなります。特にストロングパラメーターの活用は、データの整合性を維持するために不可欠です。Railsの学習の一環として、params
の特性をしっかりと理解しておきましょう。
(ChatGPTのコピペはここまで)
僕の感想
以下はChatGPTによって生成された記事に対する僕の感想です。
セキュリティに言及しているのが良かった
もともと僕の書いた記事ではセキュリティに関する言及はなかったのですが、ChatGPTが生成した記事にはセキュリティに関する言及がありました。 これはたしかにひとこと書いておいたほうがいいな、と思ったので、僕の記事にもセキュリティに関する話を追記しておきました。 (ただし、ChatGPTの文章ではなく、自分の文章で説明しています)
「paramsで参照しているのは変数ではなく、メソッド」の内容がちょっと的外れ
「paramsで参照しているのは変数ではなく、メソッド」に書いてある内容は僕の書いてほしかった内容とちょっとズレています。 一度書き直すようにお願いしたのですが、あまり改善しませんでした。 (paramsは一見変数っぽく見えるけど、実はコントローラに定義されているメソッドである、という話を書いてほしかった)
とはいえ、この内容はそれほど重要ではないですし、ChatGPTにうまく意図を伝えるのも難しいのでまあいいかな〜という感じです。
最後のまとめはやっぱりChatGPTくさい
まとめに書いてある「paramsはRails開発において重要な要素であり」とか「データの整合性を維持するために不可欠です」みたいな言い回しは、いかにもChatGPTっぽいなと思います。 ChatGPTが記事を書くと最後のまとめでやたらその技術を持ち上げるようなことを書くんですよね〜。 そんなに「重要」とか「不可欠」みたいに強調せんでもええやん、って思います。
内容は悪くないが、どこまでも先生っぽい
一部を除いて説明している内容自体は悪くないのですが、語り口はやはり、終始「テレビの向こうにいる先生」っぽい感じがしますね。 書き手の感情がほとんど見えないというか、無駄なく必要な情報を説明するだけというか。 僕だけかもしれませんが、こういう記事は読んでいてもなんか味気ない感じがします。
ChatGPTが書いた記事と人間が書いた記事、どっちが好き?
僕の書いた記事のリンクもあらためて貼っておくので、ChatGPTの記事と読み比べてみてください。
みなさんはどちらの記事が好みでしょうか?
まとめ
というわけで、このエントリでは僕がQiitaに書いた記事と同じテーマをChatGPTに書かせてみて、その出力結果と僕の感想を書いてみました。
僕自身、そこまでChatGPTを使いこなしているわけではないので、「ChatGPT 4だと全然違うぞ!」とか「うまく指示すれば人間くさい記事も出力できるぞ!」みたいなツッコミもあるかもしれません。 今後の進化の仕方によってはChatGPTくささが全然なくなる可能性もありますね。
それはともかく、「そうか、セキュリティにも言及した方がいいな」みたいな話はChatGPTを使ったメリットのひとつなので、うまく活用すると技術記事の執筆にも活用できそうです。 「ChatGPTが生成した記事をまるまるコピペ」はどうかなと思いますが、そうではなく、技術記事の執筆に生成AIをうまく活用してますよ〜という人がいたら情報を教えてください!
おまけ
これは最初から最後まで人間(=僕)が書いた技術書です↓