rails tutorial 10章 認可の実装の要約

みなさんおはようございます。

本日はrails tutorial 10章の認可についてまとめてみました。
もし、良ければ見ていってください。

認証と認可の違い

最初に似ている単語である認証と認可の違いについて簡単に説明しようと思います。

認証とは・・・サイトにログインしているユーザーを識別すること
認可とは・・・現在ログインしているユーザーができる行動を管理することです。

認可を具体例を挙げるならば、プロフィールの編集が挙げられます。
自分のだけでなく、他人のも変えられたらやりたい放題になってしましますよね。
そのようなことが無いように、認可で行動を管理します。

認可の実装

それでは実装についてまとめましたので、ぜひ見ていってください。
具体的にはログインしているユーザーは自分のプロフィール以外は編集できないという認可を実装していきます。

許可されていないユーザーがアクセスしようとした時にはbeforeフィルターを使います。
これは何らかの処理が実行される直前に行うメソッドです。

users_controller.rb

before_aciton :logged_in_users, only: [:edit, :udate]
・
・
・
def logged_in_users
unless is_logged_in?
flash[:danger] = "Please log in"
redirect_to root_url
end
end

これでまずログインしていないユーザーはedit,updateアクションを行おうとしたらroot_urlにリダイレクトします。
デフォルトではbeforeアクションは全てのアクションに適用されるためonlyで指定します。

次にログインしているユーザーは自分の情報以外変更できないようにします。
別のユーザーの情報を変更しようとしたらリダイレクトさせたいのでcorrect_userというメソッドを作成し、beforeフィルターで呼び出します。

before action :correct_user, only:[:edit, :update]
・
・
・
def correct_user
@user = User.find(params:id)
redirect_to root_url unless @user == current_user
end

次にリファクタリングですが、currnet_user?という論理値を返すメソッドを作成し、correct_userのunless @user == current_userの部分を変更します。

sessions_helper

def current_user?(user)
user = current_user
end

users_controller

def correct_user
@user = Use.find(params[:id])
redirect_to root_url unledd current_user(@user)
end

最後にログインした後に元々アクセスしようとしていたページにリダイレクトさせるアクションを作りたいと思います。

ユーザーを希望のページにリダイレクトさせるにはそれらのページをあらかじめ保存しておき、ログインができたらそのページにリダイレクトさせるという動作が必要になります。
これらの動作をstore_location,redirect_back_orメソッドで定義します。

sessions_helper

def store_location
session[:fowarding_url] = request.original_url if request.get
end
def redirect_back_or(default)
redirect_to([:fowarding_url] || default)
session.delete[:following_url]
end

store_locationメソッドではrequestに送られてきたurlをsession変数のfowarding_urlキーに格納します。
store_locationはユーザーがログインしてない時にedit,udateアクションしようとした時に行いたいのでlogged_in_userに加えます。

def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in"
redirect_to login_url
end
end

フォワーディング自体を実装するにはrediret_back_orメソッドを追加します。
このメソッドはsession[:fowarding_url]の値がtrueならそのurlに、なければデフォルトの値に飛びます。
デフォルトはcreateアクションに設定します。
users_controller

def create
・
・
・
redirect_back_or user
end

説明は以上です。
最後まで見ていただきありがとうございました。

remember機能の実装

おはようございます。

本日はrails tutorial9章、remember機能の実装についてまとめたいと思います。

永続的セッションを実装するための実装は以下のように記述されました。。

  1. 記憶トークンにランダムな文字列を用いる
  2. ブラウザのcookiesにトークンを保存するときは有効期限を設定する
  3. トークンはハッシュ値にしてから保存する
  4. ブラウザのcookiesに保存するユーザーidは暗号化する
  5. 永続ユーザーIDを含むcookiesを受け取ったら、そのIDでデータベースを検索し、記憶トークンのcookiesがデータベース内のハッシュ値と一致することを確認する

少しわかりにくいですよね笑初めて読んだときはわけ分からなくなりました。

これを自分なりに解釈したところ

  1. 記憶トークンをランダムな文字列を用いて作成し、さらにそれを暗号化した記憶ダイジェストを作る
  2. ユーザーの暗号化済みIDと記憶トークンを使いcookiesを作成する
  3. ユーザーがサイトに来た際、暗号化済みのIDと記憶トークンを持ちいて認証を行う

といった流れかなと思います。

remember機能の実装

では、早速説明していこうと思います。

remember_digestの追加

まず、最初にユーザーに記憶トークンを持たせるためのremember_digestカラムをUserモデルに追加します。

rails g migraiton add_remember_digest_to_users remember_digest:string
rails db:migrate

この二つのコマンドで実装できました。

ランダムな文字列の作成

記憶トークンはランダムな文字列でなければなりません。
TutorialではRuby標準ライブラリのSecureRandomモジュールにあるurlsafe_base64メソッドを使います。

よって以下のメソッドをUserモデルに追記します。

def User.remember_token
SecureRandom.urlsafe_base64
end

これによりランダムな文字列が追加されます。

User.rememberメソッドで記憶トークンをユーザーと関連付け、記憶ダイジェストをDBに保存する

remeber_digest(記憶ダイジェスト)は追加しましたが、記憶トークンはまだ追加されていません。
そのため、まずattr_accessorメソッドにremember_token(記憶トークン)を宣言し、アクセスできるようにします。

User.rb

attr_asseccor: remember_token
・
・
・
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest,User.digest(remember_token))
end

cookiesで永続セッション作成

ユーザーの暗号化済みのIDと記憶トークンをcookiesに保存して永続セッションを作成します。

これにはcookiesメソッドを使います。
cookiesは一つの値と有効期限から出来ています。

cookies[:remember_token] = {value: remember_token, expires: 20.years.from_now.utc}

上記のコードはpermanentメソッドを使うとシンプルになります。

cookies.permanent[:remember_token] = remember_token

ユーザーIDを保存するには

cookies[:user_id] = user.id

と記述します。

ユーザーIDと記憶トークンはセットで使うのでこちらも永続的でなければなりません。
また、このままだとセキュリティ的に良しとしないのでさらに改良します。

cookies.permanent.signed[::user_id] = user.id

signedメソッドによって暗号化できます。

記憶トークンと記憶ダイジェストを使い認証を行う

この認証にはパスワード認証の際にも使ったbcryptを用います。

User.rb

def authenticate?(remember_token)
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end

次は実際にユーザーを記憶します。

sessions_controller

def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end

sessions_helper

def remember
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = remember_token
end

既存コードの修正

今までのコードは一時セッションを前提に書かれていたのでそれを少し変更します。

現時点では一時セッションしか扱ってないので正常には機能しません。
永続セッションの場合はsession[:user_id]が存在すれば一時セッションからユーザーを取り出し、それ以外の場合はcookies[:user_id]から取り出し、対応する永続セッションにログインする必要があります。

def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
else (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated(remember_token)
log_in user
@current_user = user
end
end
end

永続セッションの破棄

手順は以下の通りです。

  1. remember_digestをnilにするメソッドを作成
  2. 1のメソッドを用いて、cookiesを削除し、ログアウトする

1については記憶ダイジェストをnilで更新すればokです。

User.rb

def forget
update_attribute(:remember_digest, nil)
end

次に1のメソッドを用いてcookiesを削除し、ログアウトします。

sessions_helper

def forget(user)
User.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
def log_out
forget(current_user)
session.delete(:user_id)
current_user = nil

「No!!!」と言える勇気

おはようございます。

本日は題名どおり「Noと言うことの大切さ」について書いていこうと思います。

Noというのは決して悪いことではない

「KY」
この言葉が現れてから、日本ではみんなと考えを合わせることが美徳と考えられて来ました。
学校においても、「仲間はずれはダメ。」、「誰とでも仲良くしなさい」と言われますよね。

しかし、みんなに合わせるのがそんなに大事でしょうか?
僕はそうは思いません。
何故なら僕たちは他の誰でもない自分だけの人生を歩んでいるからです。

「他の人がこれをやっているから、僕も」
これって他人の考えを基に生きてますよね?

そんな人生虚しくありませんか?

だから、僕は人に合わせるようなことはしません。
本当に自分がしたいことをします。
人に流されることもまだまだありますけどね笑
しかし、以前よりはNoと言えるようになってきました。

一度きりの人生です。
自分に正直になって生きて行きたいです!!!!!

rails tutorial 8章まとめ

おはようございます。

つい先日、rails tutorial8章目を終えました。
2周目だったのですが、それでも理解度は70~80%くらいでした笑
なので、一度文章でまとめてみようと思います。

rails tutorial 8章

第8章はセッションについてでした。

sessionとは

sessionとはwebサイトにアクセスしてサイトを閉じるまでに行う一連の動作のことを言います。
また、サイトを開いていても一定時間が経過してしまうと2sessionにカウントされることもある。

sessionの実装

早速sessionの実装について書いていきたいと思います。

  1. ログインフォームの作成
    ログイン、ログアウトの要素を実装するためにsessionsコントローラーを作成します。

    rails g controller sessions 

    これでsessionsコントローラーを作成できました。
    次にログインフォームを作成します。
    routeとcontrollerは以下の通りです。
    route

    get '/login', to:sessions#new

    controller

    def new
    end

    次にhtmlですが、フォームにはform_forヘルパーを使います。

    <%= form_for() do |f| %>
    ・
    ・
    ・
    <% end %>

    form_forヘルパーの引数にはどのアクションに飛んで欲しいか記述する必要があります。
    また、ユーザーの作成の際には@userを引数に取るだけで「/usersのPOSTアクションに飛んでね。」と指示できましたが、sessionsにはモデルがないのでこのようには記述できません。

    <%= form_for(:session, url:login_path) do |f| %>
    ・
    ・
    ・
    <% end %>

    となります。
    routeに記述したことで名前付きルートが使用できます。
    また、入力欄はfオブジェクトによってhtmlフォームに対応する要素を作り出します。
    よって、入力欄のコードは以下のようになります。
    new.html.erb

    <%= form_for(:session, url: login_path) do |f| %>
    <%= f.label :email %>
    <%= f.email_field :email, class: 'form-control' %>
    <%= f.label :password %>
    <%= f.password_field :password, class: 'form-control' %>
    <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>
  2. ユーザー検索と認証
    最初に無効な入力な処理を行います。

    def create
    render 'new'
    end

    ログインフォームから受け取る値はparamsに入っています。
    params[:session]
    また、sessionはemail,passwordの二つのキーを持っています。
    つまり、createが受け取る値はparams[:session][:email],params[:email][:password]の二つです。
    これを使い認証していきます。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    #ログイン成功
    else
    render 'new'
    end
    end

    find_byメソッドで該当するユーザーを検索します。
    authenticateメソッドで入力されたパスワードのハッシュ化された値と登録されている値が一致しているか確認しています。
    一致していればログインできます。

  3. ログイン
    認証は済んだので次はセッションを実装していきます。
    また、ここからたくさんのメソッドを書いていくのでそれらはhelperにまとめます。
    ログインにはsessionメソッドを使います。

    session[:user_id] = user.id

    このメソッドは使い回せるように関数にします。
    helper

    def log_in(user)
    session[:user_id] = user.id
    end

    このヘルパーメソッドをcreateアクションに記述して完成です。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    log_in user
    redirect_to user
    else
    render 'new'
    end
    end
  4. ユーザーIDを他のページでも使えるようにする
    別のページでも現在のユーザーを呼び出すためにはsession[:user_id]からユーザー検索を行えばいいです。

    def current_user
    if session[:user_id]
    User.find_by(id: session[:user_id)
    end
    end

    また、何度も上のメソッドを行うのは無駄が多いのでcurrent_userがnilの時のみ行うようにします

      if @current_user.nil?
    @current_user = User.find_by(id: session[:user_id])
    else
    @current_user
    end

    最後に上記のif文をまとめます。

    def current_user
    if session[:user_id]
    @current_user ||= User.find_by(id: session[:user_id])
    end
    end
  5. ログアウト機能の実装
    最後にログアウト機能を実装します。
    helper

    def log_out
    session.destroy[:user_id]
    @current_user = nil
    end
    def destroy
    log_out
    redirect_to root_url
    end

以上でログイン、ログアウト処理の実装が完了しました。
文にしたことで多少は整理できたはず。。。笑

ブログをするメリット

今日は自分の考えを発信することの大切さについて書きたいと思います。

自分の考えを発信するメリット

1.自分の考えと似ている人が集まってくる。

『僕自身はこう思う』、『僕はこうしたい』と口に出して言い続けることでその意見に賛同する人がどんどん集まってきます。
また、反対に自分と意見が違う人はどんどん離れていきます。
つまり、意見を発信することで自分らしく生きられる人間関係を築いて行くのが可能になるのです。
これが一つ目の利点です。

2.自分の考えを文字に起こすことで理解がより深まる。

こちらは考えというより技術的な発信についてです。

教材を読むと確かにわかった気になりますが、実際にそれを外部に発信しようとすると分かったつもりでいても理解できていない部分が明確になります。
つまり、『教材を読み込む』 → 『ブログなどでアウトプットする』これでワンセットなのです。

これが二つ目の利点です。

他にも文章の組み立てが上手になったり、書いたことは記憶に残りやすいなどのメリットもあります。
ブログは始めるためのコストもかからないので興味のある方は是非初めてみて下さい。

Gitについてまとめてみた。

今日はgitについてまとめてみようと思います。

gitとは何か

gitとはソースコードを管理するサービスです。
ソースコードを管理するメリットとしては、

  • うっかりファイルを消してしまった時でも復旧可能である。
  • コードの履歴を追える。

などがあります。
ですので、開発を使う際は積極的に使いましょう。

実際の使い方

ここでは、githubを用いて説明していきます。
まず、コマンドラインソースコードを管理したいディレクトリまで移動し、

git init

と打ち込みます。
そうすると、ディレクトリ内にgitフォルダが出来上がります。
これで準備はできました。

今現在ファイルはステージングという待機用リポジトリに置かれています。
そこからリポジトリに移動させるには

  1. git add

    リポジトリにあげるファイルを選択する

  2. git commit

    で選択したローカルリポジトリに移動する

  3. git push

    でリモートリポジトリにアップする

という三つの手順が必要です。

ブランチやマージの使い方

これらは共同開発でとても役に立ちます。
ブランチとはリポジトリのコピーでそれを使い、それを元に変更を加えていきます。
ブランチで行う変更はメインブランチに影響されないので開発自体に支障は出ません。
そして、最後にマージ(合流)してメインブランチに変更を取り込みます。

以上がgitの説明になります。
gitは会社に入ってチーム開発になると必須のスキルとなるので是非とも今のうちから意識して身につけていきたいですね。

『嫌われる勇気』から考える人が変わる方法

おはようございます。

本日は僕が最近読んだ本、『嫌われる勇気』から人が変わる方法を考えていきたいと思います。

1.あらすじ

この本ではアドラー心理学と言うものを用いながら、幸せに生きる方法について説いていくお話です。
アドラー心理学を研究している老人とその部屋に訪れた青年の対話形式で物語は進んでいきます。

なぜ、人は変われないのか

人が変われない理由には原因論が関係していると思います。
原因論とは過去の経験から今が決まると言う考え方です。
例えば、『今日は疲れたから勉強しなくていいや』、『今週は仕事頑張ったから散財しよ』などです。

しかし、アドラー心理学では逆から考えるそうです。
つまり、
『今日は疲れたから勉強しなくていいや』 → 『勉強したくないから今日は疲れたことを引き合いに出す。』
『今週は仕事頑張ったから散財しよ』 → 『散財したいから今週頑張ったことを引き合いに出す』と考えます。

原因論は現在の目的にかなう過去を引き合いに出しています。
反対に目的論は過去と今を引き離して考えます。
つまり、過去の経験にとらわれずにいきていく事ができます。

また、『人間が変われないのは変わる勇気がないからだ』とも言っています。
これも原因論、目的論と関係しています。
変わりたいと口だけで言っている人は過去の経験を出してきて、やはり行動しません。
変わりたいと本気で思っている人は過去のことなど気にせず、今必死に努力しています。

人が変わる方法

先ほども話した通り、過去の話をして言い訳している時点でもう終わっています。
つまり、やることはただ一つ。今日この日になりたい自分に向かって努力していくだけです。
結局はそこだと思います。
今を変えたいと覚悟をもち必死に取り組んでる人が幸せを掴めると思います。

この本を読むと難しいことを考えずに、今この瞬間を生きないといけないなと思わされます。
気になった方はぜひ読んでみてください。

Helperを使いこなそう

おはようございます。

本日はHelperについての説明をしていこうと思います。

Helperって何?

Helperとは文字通りHelp、助けてくれるものです。
では、何を助けてくれるかと言うと、それはViewをよりシンプルに書くのをです。

Helperの例

<%= form_tag %>
<%= f.submit %>
<%= link_to %>
などはみなさん使ったことはありますよね?
これ全部Helperなんです。

Helperを使うメリット

複数のviewに似たような記述がある時まとめる事ができる

例えば次のようなコードがあったとします。

<h1>Helper</h1>
<a href="#">Helper</a>

など、複数に渡って同じ文字が書かれてるとします。同じ文字を何回も書くのは面倒ですよね。こんな時にHelperを使います。

def test
Helper
end
<h1><%= test %></h1>
<a href="#"><%= test %></h1>

このようにHelper内で関数として定義して、viewで関数を呼び出します。
関数としてまとめる事で修正する時も関数を修正するだけなので手間が省けます。

今回はHelperについて紹介しました。
僕もまだtutorialを始めたばかりなのでアドバイスなどありましたら、どんどん聞かせてください。

今日はありがとうございました。

物事を続けるために気をつけること

おはようございます。
本日は物事を続けるコツについてよく聞くけど問題点やそれに対する自分なりの考えを述べていきたいと思います。

1.毎日やるべきノルマに疲れた

これは誰もが経験があると思いますが、最初に1日◯◯時間もする!!!と壮大な設定をしてしまい段々とやるのが面倒くさくなるパターンです。
僕もよくありました。笑
「これから◯◯時間もやるのか〜」と。笑
こういう場合ですが、そもそも最初の設定が間違っています。
最初のハードルはぐんっっと下げるべきなのです。
塵も積もれば山となると言いますよね。
最後は継続したもの勝ちなのです。

2.やる時間がない

これについては簡単です。
やるべきことをいつやるか時間を決めてその時間と前後1時間は絶対に予定を入れないようにするのです。
僕自身2018年は簿記とプログラミングを学んでいました。
1日最低でも6時間は時間が必要だと思ったので旅行はもちろん、1日遊びに行くこともありませんでした。
1日は24時間と有限です。
なので、自分がしたいことに優先順位をつけて順位が高いものから時間を割り振っていくべきです。

3.やる気が出ない

これは1と関連しています。
「これから◯◯時間もやるのか」と。
心理的ハードルが大分上がっています。
最初の設定をぐんと下げたにも関わらずやる気が起きない。
そんな時は「今日はやらなくていい!でも最初の動作だけはやろう!」ということです。
ここでいう最初の動作とは勉強であれば、机に向かう、パソコンを開くなどです。
それだけでいいの?と思われますが1番怖いのはハードルを上げすぎて挫折するパターンなのです。
塵も積もれば山となります。
1日で成功するようなことは絶対にありません。
ゆっくり確実に歩みましょう。
やる気が出ない方は最初にお金を投資することもおススメです。
僕はプログラミングの勉強で挫けたことは何度もありますがその度に最初にスクール代の30万を払ったことを思い出し奮起していました笑

あ、あと一つ。
勉強中にスマホを見てしまうことよくありますよね?笑
スマホは集中力を奪うのでとても厄介です。笑

僕は自宅で勉強することが多いのですがスマホは絶対に部屋に持っていきません。
視界に入るだけでアウトだと思ってるので。

長々と書いてしまいましたが、要するに勉強に集中できる仕組みを作って、あとはコツコツ地道にやっていこうと言いたいだけでした笑

本日は以上です。
見ていただきありがとうございました。

Rails Tutorial 4章 まとめ

おはようございます。

最近はrails tutorialに苦戦しながらも取り組み、先ほど4章が終了しました。

ですので、一度このブログ内でまとめようと思います。

文字列

文字列は””で囲み、表示させる。

"example"
=>example

結合は+演算子を使う

"今の首相は" + "麻生さん"
=> 今の首相は麻生さん

文字列を組み立てる方法には式展開というものもある。これには#{}というものを使う。

name = "麻生さん"
"今の首相は#{name}"
=>今の首相は麻生さん

このように#{}は変数を文字列に入れるときに使用します。

シングルクォートの使い方

文字列はダブルクォートかシングルクォートで囲み、表示させます。
しかし、シングルクォーテーションだと式展開ができませんので僕は基本的にはダブルクォートを使います。

シングルクォートは#{}をそのまま表示させたいと言った時に使用します。

オブジェクト

オブジェクトとはメッセージに応答するものです。
例えば、

"basket".legth
=> 6

これはlength(何文字?)というメッセージに”basket”文字列が応答したものです。

同様に

"basket".empty?
=>false

こちらはempty?(空っぽ?)というメッセージに対してfalseと返しています。
true,falseという論理値を返すことを?で表します。

if文でも使われます。

s = ""
if s.empty?
"yes,empty"
else
"nonempty"
end
=>yes,empty"

なお、論理値はそれぞれ&&(かつ),||(または),!(not)でも使われます。

a = ''
b = 'nonempty'
puts "both string empty" if a.empty? && b.empty?
=>nil
puts "one of the string empty" if a.empty? || b.empty?
=> "both string empty"
puts b if !b.empty?

なお、上記の文は全てif文が後ろに来てますよね。
trueの処理しか書かない場合、このようにif文を後ろに書くことが可能になります。

次に数字を文字列に変換する方法です。
変換するには”to_s”を使います。

b = 1
puts b
=> 1
b.to_s
puts b
=> "1"

メソッド

メソッドは引数があることが大前提のように思ってましたが、なくても良いらしいです。

def string_message(str = '')
if str.empty?
puts "empty"
else
puts "nonempty"
end
end
$ string_massage
=>"empty"

このように引数を指定しなくてもエラーが出ません。
なぜかと言いますと、メソッドを定義した段階でデフォルト値を含めているからです。(str = ”)
これを定義したことによって引数が渡されなかった場合はデフォルト値が渡されるようになります。

また、rubyでは一度値を返したらその後の値は表示されません。

def string_message(str = '')
return "empty" if str.empty?
return "nonempty"
end

上の関数の場合、2行目はご存知if文ですね。strが空っぽだったらtrueで”empty”が返されます。その場合もう値を返したので3行目のnonemptyは表示されません。
次に2行目がfalseだった場合、”empty”は返されません。
また、まだ一度も値を返していないので3行目に”nonempt”を返すことができます。

このようにif文は書き直すことができます。

配列と範囲

split >>>文字列を区切り表示させます。

a = "asou tarou"
a.split(' ')
=> "asou" "tarou"

次に配列です。配列は特定の順序をもつ要素のリストです。

name = ["太郎", "二郎", "三郎"]
$ name
=>["太郎", "二郎", "三郎"]

インデックスを付けることによって特定の要素だけを取り出すことができます。

$ name[0]
=> "太郎"

配列の追加にはpushメソッドを使います。

name.push = "四郎"
$name[3]
=> "四郎"

to_aメソッドは範囲を配列に変換できます。

$ 0..9 #0~9の範囲
=>0..9
$ (0..9).to_a #配列に変換
=>[0,1,2,3,4,5,6,7,8,9]

mapメソッドは渡されたブロックを配列や範囲オブジェクトに適用し、結果を返す。

(1..5).map{|i| i ** 2}
=>[1, 4, 9, 16, 25]

これは1~5の数字をそれぞれ二乗して新しく配列に入れています。

ハッシュとシンボル

ハッシュは配列と似ていますがインデックスとして整数値以外も呼び出せるのが異なる点です。

president = {"first_name" => "tarou", "last_name" => "asou"}
president[:first_name]
=>"tarou"

このようにハッシュは要素を{}で囲み、その中にキーと対応する値をかきます。
また、railsでは文字列よりもシンボルが主流だそうです。
シンボルとはクォートのかわりに先頭に「:」を付けることです。

先ほどの文は次のように直せます。

president = {:first_name => "tarou", :last_name => "asou"}
president[:first_name]
=>"tarou"

また、:キー => とキー:は等価であるため、

president = {first_name: "tarou", last_name: "asou"}
president[:first_name]
=>"tarou"

と表記することも可能です。

また、ハッシュの値にはなんでも使うことが出来、他のハッシュを使うことも可能です。

params = {}
params[:user] = {:name => "asou" :gender => "man"}
params[:user][:name]
=>"asou"

また、ハッシュもeachメソッドに対応します。

profile = {}
profile = {name: "asou", gender: "man", age: "22"}
profile.each do |key, value|
puts "私の#{key}は#{value}です"
end

このようにハッシュでeach文を作る場合はキーと値の二つの変数を渡すことを注意してください。

クラスの作成

最後にクラスの作成します。

class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name}>#{@email}"
end
end

attr_accessor・・・こちらはname,email属性(attributes)にそれぞれ対応したアクセサーを作成します。
次のinitializeメソッドは新たにインスタンスを作成した時に自動で呼び出されるメソッドです。
attributesのそれぞれのキーに対応する値を@name,@email変数に代入します。
変数の頭に@を付けることでビューでも使用可能になります。

最後のformatted_emailは式展開が使われていますね。

今日は以上です。
最後まで見てくださった方々ありがとうございました。