更新情報

こんにちは。Dive into Code の野呂です。

私は、34歳で約2ヶ月間集中して自習してWebアプリケーションの開発を行い、Rails3技術者認定ブロンズを一発合格した経験があります。現在は、プログラミング・スクール「Dive into Code」の講師を務めています。

今回は、つまずきやすいポイント「ストロングパラメータの仕組み」について解説をします。効果的に学習を進めるためのお役に立つことができましたら、幸いです。

ストロングパラメータ

Ruby on Rails は、Webアプリケーションフレームワークです。インターネット上でアクセスできるWebアプリケーションをつくるために使われます。

インターネット上でWebアプリケーションにアクセスする流れは、指定のURLにアクセスして httpリクエストを発生させて、それをWebアプリケーションが入っているコンピュータ(サーバ)が受け取り、レスポンスを返す、というものです。

noro20160401

Ruby on Railsには、 httpリクエストが流れてくると、その中に入っている値(パラメータ)を取得してプログラム内部で利用することができる仕組みが備わっています。

ひと言で説明すると、「Web画面上から内部へ流れてきた値を安全に受け取る仕組み」です。

つまずきやすいポイント

初学者が、ストロングパラメータの仕組みを理解する際に大切なことは、「httpリクエストがどのようなものなのか理解する」こと。次に「ストロングパラメータでどのように受け取り、どのように使うのかを理解する」ことです。

まず、「httpリクエストがどのようなものなのか理解する」についてです。

httpリクエストがどのようなものなのか理解する

初学者は、Ruby on Railsのフレームワークの役割とディレクトリ構造を覚えることに苦心します。そのため、”httpリクエストがどのようなものなのか” については見落とされがちです。普段から目に見えないため、学習するキッカケさえ自分からは見つけられないかもしれません。

Webアプリケーションは、Webブラウザに HTML や CSS を読み込ませて表示されます。
”HTMLでその構造が書かれている” ことをまず認識しましょう。

今回、サンプルでお見せするアプリケーションは、以下のコマンドで新規作成したアプリケーションです。

$ rails new achieve -d postgresql
$ cd achieve
$ rails g scaffold blog title:string content:text

手を動かして確認をされたい方は作成をしてみてください。

では、まず rails s でサーバ起動をして確認したプレビュー画面から見ていきましょう。

noro20160402

ここで、httpリクエストが発生するものは、
<a href=”/blogs/new”>New Blog</a> の <a href=”/blogs/new”> というリンクの部分です。ここをクリックすると画面が遷移します。

noro20160403

さて、この遷移前後でどのような httpリクエストを確認したことはありますでしょうか。
これを確認せずに Ruby on Rails の学習を進める初学者が多いです。

Webブラウザ上から流れる httpリクエストは、Webブラウザ「Chrome」の機能を使えば見ることができます。さっそく見てみましょう。

1.Webブラウザ上の空欄で右クリックをする

noro20160404

2.「検証」をクリックする

noro20160405

3.「Networkタブ」をクリックする

noro20160406

4. 「New Blog」リンクをクリックする

noro20160407

5.「検証」のネットワーク欄内を見る

noro20160408

6.「new」をクリックして、Headerタブをクリックする

noro20160409

7.Headersタブ内に表示されている内容を確認する

Request URL:https://code-hiroyoshinoro.c9users.io/blogs/new
Request Method:GET

この2行は、リンクをクリックして発生したhttpリクエストの内容で、Ruby on Railsアプリケーション内でルータが送り先のコントローラを判別する際に使われます。
この例では、まだストロングパラメータを使う値の受け渡しはされていません。

Chrome では、「検証>Network」からネットワーク上を流れた通信の実物を見ることができます。

次に「ストロングパラメータでどのように受け取り、どのように使うのかを理解する」についてです。

ストロングパラメータの仕組み

ストロングパラメータは、「Web画面上から内部へ流れてきた値を安全に受け取る仕組み」です。

先ほどの例の「入力フォーム」を例にして手順で解説します。

1.入力欄に値を入力する

noro20160410

2.「Create Blog」をクリックして保存する

noro20160411

3. 2で発生した httpリクエストを「検証>Network>Headers」で確認する

noro20160412

ここで、httpリクエストは General の
Request URL:https://code-hiroyoshinoro.c9users.io/blogs
Request Method:POST
が、Ruby on Rails内のルータが送り先コントローラを判別するために使われます。

また、Form Data の
blog[title]:私たちのミッションは、
blog[content]:すべての人が、テクノロジーを武器にして活躍できる社会をつくることです。
が、Ruby on Rails内のコントローラ内部で使われる値(パラメータ)として使われます。

この Form Data の値。これをコントローラ内部で受け取る仕組みが、ストロングパラメータです。

実物を見てみましょう。
httpリクエストの「/blogs POST」がどのルーティングに該当するか、から見ていきます。

$ bin/rake routes

 

Prefix Verb   URI Pattern               Controller#Action

POST   /blogs(.:format)          blogs#create

 

blogsコントローラのcreateアクションに処理が流れます。

 

次にコントローラの内容を見てみましょう。

※解説箇所のみの抜粋です。

 

class BlogsController < ApplicationController

 

def create

@blog = Blog.new(blog_params)

 

respond_to do |format|

if @blog.save

format.html { redirect_to @blog, notice: ‘Blog was successfully created.’ }

format.json { render :show, status: :created, location: @blog }

else

format.html { render :new }

format.json { render json: @blog.errors, status: :unprocessable_entity }

end

end

end

 

private

# Never trust parameters from the scary internet, only allow the white list through.

def blog_params

params.require(:blog).permit(:title, :content)

end

end

 

ソースコードを見ると、

 

def create

@blog = Blog.new(blog_params)

 

にて、blog_paramsメソッドを実行した結果

 

def blog_params

params.require(:blog).permit(:title, :content)

end

 

を、new(  ) メソッドの引数として使い、Blogモデルクラスのインスタンスを生成して、@blogに格納しています。この blog_params メソッドがストロングパラメータと呼ばれる仕組みを実現しているメソッドです。

 

ここで、

 

params.require(:blog).permit(:title, :content)

 

は、httpリクエストの Form Data にて確認した

blog[title]:私たちのミッションは、

blog[content]:すべての人が、テクノロジーを武器にして活躍できる社会をつくることです。

 

を受け取ることを許可する、というものです。

 

:blog は、blog[] のことです。

:titleや:contentは [title] や [content] のことです。

 

これらの httpリクエスト上の Form Data などの値を、Ruby on Rails では params メソッドでコントローラ内部に受け取ることができます。

 

params.require(:blog).permit(:title, :content)

 

は、「httpリクエスト上にあるパラメータのうち :blog というキーを持ち、 :title と :content というキーを持つハッシュ形式であること」を確かめます。

確かめる目的は、Webブラウザ上で手作業などで意図的にパラメータを書き換えられた際に、エラーとして弾くことができるようにするためです。

 

その後 @blog に格納された内容は、データベース内に保存されます。

 

if @blog.save

 

 

以上が、ストロングパラメータの仕組みです。

 

ストロングパラメータは、Ruby on Rails のバージョン4 で初めて実装されました。

それまでのパラメータよりもセキュリティが強い。だから、「ストロング」パラメータなのです。

 

初学者がRuby on Railsのストロングパラメータを使う場合は、

・httpリクエスト上の値(パラメータ)がどのようなものかを Chromeの「検証」で目視確認すること

・その値が、コントローラ内部の ストロングパラメータ用のメソッドで受け取るようにする必要があること

をしっかり理解しましょう。

 

私のコラムでは、Ruby on Rails を学習する初学者がつまずきやすいポイントを補う内容をお伝えしていきます。お読みくださり、ありがとうございます。

 

それでは、また!