プログラミング備忘録

プログラミングの学習状況をメモしています

46日目

今日の学習

Ruby on Rails

Railsチュートリアル 第7章

railstutorial.jp

この章では、ユーザー登録機能を追加する。

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。今ログインしている人の情報を自動で引っ張ってきてくれる、くらいの感覚しかないため、理解を深める必要がある。

paramsParametersパラメータのことを指している。

paramsには、ハッシュが入る。idが1の場合は、Parameters: {“id”=>”1”}としてデータが渡されるということになる。

/users/1でアクセスした場合は、paramsが自動的にidが1だというハッシュの役割を担ってくれるおかげで、指定のページの表示が可能になる。

【Rails入門】params使い方まとめ | 侍エンジニアブログ

paramsとはRailsで送られてきた値を受け取るためのメソッドです。

パラメータの取得 - Ruby on 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キーワード以降のコードのインデントを通常より一段下げて書くと分かりやすいよ、と推奨している。

*1:Create, Read, Update, Delete

*2:POST / GET / PATCH / DELETE