46日目
今日の学習
Ruby on Rails
Railsチュートリアル 第7章
この章では、ユーザー登録機能を追加する。
HTMLのフォームを使って、Webアプリケーションに登録情報を送信する。
登録されたユーザーの情報を表示するページの作成まで進めるようだ。
開発環境だけにデバッグ情報を表示する
<%= debug(params) if Rails.env.development? %>
if以下の文章が、開発環境でのみtrueになるため、本番環境では挿入されることはない。
REST
REST
は、REpresentational State Transfer
の略。アーキテクチャのひとつ。
RailsにおけるRESTは、アプリケーションを構成する部分(ユーザーや、投稿されたものなど)を「リソース
」としてモデル化することを指す。
リソース
は、CRUD操作*1と、4つのHTTP requestメソッド*2の両方に対応している。
データベースにあるデータなどを、自由にCRUD操作できるもの(リソース)として扱う設計。
RESTの形式を採ることで、作成するべきコントローラやアクションを作ることが楽になる。
routes.rb
に記載するresources :**
は、「このリソースのルートを作りますよという意味で、この記述を利用することによってRESTfulなリソースで必要となる全てのアクションが利用できるようになる。
Railsを支える基本概念の整理(RESTfulやリソースなど) - Qiita
(resources :users
で利用できるようになるアクションとルート](https://qiita.com/kidach1/items/43e53811c12351915278#users%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8Brestful%E3%81%AA%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E4%B8%80%E8%A6%A7)
params
Railsでしょっちゅう使っているparams
。今ログインしている人の情報を自動で引っ張ってきてくれる、くらいの感覚しかないため、理解を深める必要がある。
params
はParameters
、パラメータ
のことを指している。
params
には、ハッシュが入る。idが1の場合は、Parameters: {“id”=>”1”}
としてデータが渡されるということになる。
/users/1
でアクセスした場合は、params
が自動的にidが1だというハッシュの役割を担ってくれるおかげで、指定のページの表示が可能になる。
【Rails入門】params使い方まとめ | 侍エンジニアブログ
paramsとはRailsで送られてきた値を受け取るためのメソッドです。
【Ruby on Rails】params[:id] とは?(初心者〜中級者向け)Where does params[:id] come from in rails? - YouTube
paramsとは送られてきた値を受け取るためのメソッド
利用しているユーザーが何かしらの情報を送ったときに受け取るものがparams。
以下のように、一覧表示でコンテンツが並んでおり、上からidが1,2,3だったとする。
Ruby PHP Java
ユーザーが、「Rubyの情報を見たい」と思い、Rubyのページを要求すると、Rubyページのshowアクションが起動する。
def show @post = Post.find_by(params[:id]) end
このような形だった場合、params
は自動的に「Rubyのidは1なので、postのidが1の情報を代入しよう」と働いてくれる。
そのため、params[:id]
と設定しておくだけであとはRails側が勝手に動いてくれる...という理解でいいだろうか。
後ほど記述するform_withの部分でもparams
について触れる。
Gravatarをプロフィールに導入
Gravatarとは、プロフィール写真をアップロードして、指定したメールアドレスと関連づけることができるサービスらしい。
gravatar_for
ヘルパーメソッドを利用して、Gravatarの画像を利用できるようにする。
gravatar_for @user
Digest
ライブラリのhexdigest
メソッドを利用して、ユーザーのメールアドレスをハッシュ化する。
以下のようにgravatar_for
ヘルパーメソッドを定義する。
app/heplers/users_hepler.rb
module UsersHelper def gravatar_for(user) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" image_tag(gravatar_url, alt: user.name, class: "gravatar") end end
form_withを使用してユーザー登録
Railsでは、ユーザー登録ページは/signup
になっている。
routes.rb
に、以下のように記述する。
get "/signup", to: "users#new"
コントローラ側ではnew
の部分に、ユーザー登録に必要なものを書き足していく。
new.html.erb
ファイルに、form_with
を利用して登録できるようにする。
<%= form_with(model: @user, local: true) do | form | %> <% end %>
ハッシュ引数local: true
は、エラーメッセージを確実に表示するために設定しておく。
create
アクションを作成して、newアクションを介したページでの情報を保存したり、保存できなかった場合はエラーを表示したりするようにする。
Strong Parameters
まず、params
でデータを受け取る部分。
@user = User.new(params[:user]) # 上の形と同じ @user = User.new(name: "Hasegawa", email: "hase@exam.com", password: "hase", password_confirmation: "hase")
上記の書き方ではマスアサインメント脆弱性
があり、セキュリティを高める必要がある。
そのために採る対策が、Strong Parameters
(ストロングパラメータ)。
Rails 6 でプロダクト開発を学ぼう - Railsチュートリアル
もしも@user = User.new(params[:user])
のままにしていたらどのような問題が起こりうるのか説明してある。
【Ruby on Rails】ストロングパラメータって何なの? - Qiita
要は、製作者が意図しないデータを受け取らないようにするというもののようだ。
今作成中のアプリで、ユーザー登録の際に必要なものは「名前」「メールアドレス」「パスワード」「確認パスワード」の4つなので、この4つ以外を許可しないように設定をしなければならない。
ユーザー用のparams
なので、以下のように記述する。
def create @user = User.new(user_params) (省略) private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end
ここでprivate
キーワードを使って、外部から使えないようにする。
user_params
メソッドは、このメソッドを記述するUsersコントローラの内部でのみ使用して、他で使用する必要はないため。
Railsチュートリアルでは、private
キーワード以降のコードのインデントを通常より一段下げて書くと分かりやすいよ、と推奨している。