Progate(プロゲート)でRuby on Railsの学習メモ




 

こんにちは。Tomoyuki(@tomoyuki65)です。

Web開発のスキルアップに向けてProgateで学習中ですが、Ruby on Railsと呼ばれるフレームワークを使えば比較的簡単にWebサイトを作れるんです。

今じゃ結構メジャーな部類なので、Rubyと合わせて使い方を覚えるのがおすすめですよ。

ということで、Ruby on Railsについて学習メモを残しておきます。

 

目次

Ruby on Railsとは?

Ruby on Rails(略してRails)とは、Webアプリケーション開発の「フレームワーク」のことであり、このフレームワークを利用することで開発に必要な作業を減らすことが可能です。

そんなRailsをマスターすれば、自由自在に好きなWebアプリケーションを創れるようになります。

 

Ruby on Railsの準備

Railsで開発するには、「rails new アプリケーション名」というコマンドをターミナル(Macの場合)で実行します。

$ rails new tweet_app

コマンド実行後、入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意されます。

 

サーバーの立ち上げ

開発中のWebアプリケーションをブラウザで表示するにはサーバーの起動が必要で、起動するには「rails server」コマンドを使います。

$ rails server

サーバー起動後にブラウザで「localhost:3000」というURLにアクセスすると、初期画面が表示されて確認できます。

 

Ruby on Railsでページの自動生成

まず最初にページに必要なファイルを自動生成するには、「rails generate controller」コマンドを使います。(generateはgに省略可能なので、rails g controllerでも可)

例えば「home」コントローラーとそれに対応する「top」アクションによるファイルを作成するには次の通りです。

$ rails g controller home top

※だだし、同じ名前のコントローラがすでにある場合は、このコマンドは使えない

コマンド実行後、ルーティングが追加され、コントローラー(controller)とビュー(View)のファイルが自動生成されてページを表示できるようになります。

 

 ルーティングファイル(/config/routes.rb)

「routes.rb」ファイルにルーティングが追加され、上図の例では「home/top」のURLにアクセスした時に「home#top」(homeコントローラーのtopアクション)が処理されることを表します。

尚、「get “home/top”」ならURL「localhost:3000/home/top」にアクセスすると表示されますが、「get “/”」に変更すれはURL「localhost:3000」で表示できるようになります。

 

 コントローラー(app/controllers/home_controller.rb)

作成された「home_controller.rb」ファイルには、「top」メソッドが記述されています。

「top」メソッドが実行されると、コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返します。

※コントローラー内のメソッドをアクションと呼びます。

 

 ビュー(app/views/home/top.html.erb)

viewsフォルダにコントローラーと同じ名前のフォルダが作成され、その中にビューファイル「top.html.erb」が作成されます。

また、ビューに対応するCSSファイルとして、app/assets/stylesheets直下に「home.scss」ファイルが作成されているので、これによりレイアウトの修正が可能です。

尚、画像ファイルを表示したい場合は、「public」フォルダの中に画像ファイルを格納すれば、ビューやCSSで表示可能です。

 

ルーティングと同じURLで簡単にリンクを作る

HTMLでリンクを作るには<a>タグを使いますが、ルーティングのURL部分と同じにすることで、簡単にリンク先を指定できます。

<a href="/"></a>

※リンクは必ず「/」から始める(href=”/about”など)

 

Ruby on RailsのビューでRubyコードを使う

index.html.erbのようなerb形式のファイルでは、<% %>で囲むことでHTMLファイルの中にRubyのコードを記述できます。

※「erb」とは「Embedded Ruby(埋め込みRuby)」の略です。

<% post = "Rails学習中" %>

 

そして、埋め込むRubyコードをブラウザに表示するには、<%= %>を使います。

<div class="posts-index-item">
  <% post = "Rails学習中" %>
  <%= post %>
</div>

 

このように、<% %>の場合は何も表示されないので変数定義などに使い、<%= %>はRubyコードの中身が表示されるため変数の値などを実際にページ内に表示するのに使います。

 

配列とeach文で複数の値を表示

ページに複数の値を表示したい場合は、配列に値をまとめてeach文を使うことで簡単に表示できます。

<%
  posts = [
    "Rails学習中",
    "Rails楽しい"
  ]
%>

<% posts.each do |post| %>
  <div class="posts-index-item">
    <%= post %>
  </div>
<% end %>

 

また、配列などを定義する場合は、コントローラーファイルのアクション内で定義するのが一般的です。

だだし、アクション内で定義した変数をビューで使うには、頭に「@」をつけた変数名を定義します。

class HomeController < ApplicationController
  def index
    @posts = [
      "Rails学習中",
      "Rails楽しい"
    ]
  end
end

 



Ruby on Railsでテーブル作成

Railsでデータベースを用意してテーブルを作成するには、「rails g model」コマンドを使用します。

コマンドを実行するとマイグレーションファイルと呼ばれる、データベースに変更を指示するためのファイルが作成されます。

例えばtext型(長い文字列)のカラムを持つpostsテーブルを作成するには以下の通りです。

$ rails g model Post content:text

※例えばpostsテーブルを作成するなら、コマンドでは単数形で「Post」とするので注意

 

コマンド実行後にdb/migrate直下にマイグレーションファイルが作成されるので、「rails db:migrate」コマンドでデータベースに変更を反映します。

$ rails db:migrate

 

コマンドを実行するとマイグレーションファイルに書いてある指示通りにテーブルを作成しますが、「id」、「created_at」、「updated_at」というカラムも自動生成される仕様になっています。

 

また、Postモデルが定義されたファイル「post.rb」が、app/modelsフォルダの中に作成され、このようにApplicationRecordを継承したクラスをモデルと呼びます。

 

マイグレーションエラー

尚、Railsではデータベースに反映されていないマイグレーションファイルが存在すると、マイグレーションエラーが発生します。

そのため、マイグレーションファイルを作成したら必ず「rails db:migrate」コマンドを実行する必要があります。

 

Ruby on Railsでrails consoleを使う

rails console」コマンドを使うと、コンソールを起動してRubyコードを手軽に実行できます。

例えば「1 + 1」を実行するとその結果が表示され、「quit」を実行するとコンソールを終了できます。

また、変数を定義すると次のようになります。

> text = "Hello"
=> "Hello"
> text + "World"
=> "HelloWorld"

 

テーブルにデータを作成する

rails consoleを使えばテーブルにデータを作成できます。

例えばpostsテーブルのカラム「content」に文字列「”Hello World”」のデータを作成するには、newメソッドでインスタンスを作成した後、saveメソッドを使います。

> post = Post.new(content: "Hello World")
> post.save

※PostモデルはApplicationRecordを継承しているため、saveメソッドが使えます

 

テーブルに保存されているデータを取得する

また、テーブルに保存されているデータを取得することもできます。

例えばrails consoleを使ってpostsテーブルの最初のデータを取得したい場合は、firstメソッドを使います。

> post = Post.first
> post.content
=> "Hello World"

 

そして、全てのデータを取得するにはallメソッドを使い、配列で取得できます。

> posts = Post.all
> posts[0].content
=> "Hello World"

 

このようにテーブルからデータを取得できるため、取得したデータをビューに表示したい場合は、コントローラーのアクション内でデータを取得して使用します。

class HomeController < ApplicationController
  def index
    @posts = Post.all
  end
end

 

また、特定のデータを取得したい場合は、find_byメソッドを使います。

例えばidが1のデータを取得する場合は次の通りです。

class HomeController < ApplicationController
  def index
    @post = Post.find_by(id: 1)
  end
end

 

Ruby on Railsの共通レイアウト

例えばWebサイトのヘッダー部分など、全てのページで共通の部分がある場合は、views/layoutsフォルダにある「application.html.erb」に書きます。

初期状態で<head>タグや<body>タグなどの共通部分が書かれているため、<header>タグや<footer>タグなどの共通部分はこのファイルに書きましょう。

application.html.erb

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <header>
    </header>
    <%= yield %>
  </body>
</html>

尚、作成した各ビューファイルは、「<%= yield %>」のyieldに代入されて表示されます。

 

Ruby on Railsのリンク

Railsでは、link_toメソッドを使えば、リンクに使う<a>タグを作成できます。

link_toメソッドでは、第一引数に表示する文字、第二引数にURLを書きます。

<%= link_to("About", "/about") %>

上記の例では、以下のような<a>タグに変換されることを表します。

<a herf="/about">About</a>

 



Ruby on RailsでURLにテーブルのidを持たせる

例えば「localhost:3000/posts/1」、「localhost:3000/posts/2」というように、URLにidを含めてそのidを持つデータをビューに表示したい場合は、ルーティングのURL部分で「:id」を使います。

routes.rb

Rails.application.routes.draw do
  get "posts/index" => "posts#index"
  get "posts/:id" => "posts#show"
end

上記のようにルーティングを指定すれば、「/posts/1」でも「/posts/2」でも同じアクションが処理されます。

ただし、ルーティングは合致するURLを上から順に探すため、上記の例では「posts/index」より下に書く必要があるので注意が必要です。

 

ルーティングで設定したURLの「:id」の値を取得する

コントローラのアクション内では、ルーティングで設定したURLの「:id」の値を取得できますが、取得するには「params」を使います。(paramsには、:idをキーにもつハッシュが入っています)

def show
  @id = params[:id]
end

 

これを使ってテーブルからデータを取得するには、find_byメソッドと合わせて使います。

def show
  @post = Post.find_by(id: params[:id])
end

 

また、ビューでidを含むリンクを作成するには次の通りです。(Rubyでは#{}で変数展開が可能です)

<%= link_to(post.content, "/post/#{post.id}") %>

 

Ruby on Railsで入力フォームのデータを保存する

<textarea>タグや<input>タグを用いることで入力フォームを作成(送信ボタンにはtype=”submit”と、value=”投稿”を指定した場合)できますが、入力されたデータをデーターベースに保存するには、ルーティングとアクションを追加し、ビューでform_tagメソッドを使います。

routes.rb

Rails.application.routes.draw do
  get "posts/index" => "posts#index"
  get "posts/:id" => "posts#show"

  post "posts/create" => "posts#create"
end

※formの値を受け取るには、getでなく「post」を使う

 

ビューではform_tagを使い、doとendの間にフォームを作ります。このとき<textarea>タグにname属性を指定すると、<input type=”submit” …>のボタンを押したときに指定されたURLにデータが送信されます。

<%= form_tag("posts/create") do %>
  <textarea name="content"></textarea>
  <input type="submit" value="投稿">
<% end %>

※name属性の値をキーとしたハッシュがRails側に送られます。

 

フォームに入力されたデータを受け取って保存するには、paramsを使って処理します。

def create
  @post = Post.new(content: params[:content])
  @post.save
end

 

リダイレクト

尚、フォームのボタンを押した後に他のURLに転送する(表示したいビューに遷移させる)には、redirect_toメソッドを使ってリダイレクトさせます。

def create
  @post = Post.new(content: params[:content])
  @post.save
  redirect_to("/posts/index")
end

 

Ruby on Railsでテーブルのデータを並び替えて取得する

テーブルのデータを並び替えて取得したい場合は、orderメソッドを使います。

「order(カラム名: 並び替えの順序)」のように使い、並び替えの順序は昇順(:asc)と降順(:desc)のどちらかを指定します。

def index
  @posts = Post.all.order(created_at: :desc)
end

 



Ruby on Railsでデータの編集と削除

データベースのデータを編集するには、対象データを取得後、値を上書きしてsaveメソッドを使う。(データを更新すると、カラム「update_at」の値が更新した時刻に更新される)

post = Post.find_by(id: 1)
post.content = "データを編集"
post.save

 

そして、データを削除する場合は、対象データを取得後、destroyメソッドを使う。

post = Post.find_by(id: 1)
post.destroy

 

また、データベースの変更を伴う際のルーティングでは、getではなく「post」を使う。

post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"

 

フォームの初期値

<textarea>タグなどの初期値を設定したい場合、ルーティングに「:id」を含めてアクションで対象データを検索し、取得データを使うことができます。

ルーティング

get "posts/:id/edit" => "posts#edit"
コントローラー

def edit

@post = Post.find_by(id: params[:id])

end

ビュー

<textarea><%= @post.content %></textarea>

 

また、<input>タグの場合は、value属性の値が初期値になります。

<input name="name" value="<%= @user.name %>">

 

post用のリンク

「link_to」は通常getで書かれているルーティングを探すため、postを探すためにはlink_toの第三引数に「{method: “post”}」を追加する。

<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>

 

Ruby on Railsのバリデーション

バリデーションとは、不正なデータがデータベースに保存されないようにデータをチェックする仕組みのことです。

バリデーションはモデルに設定し、「validates」を用いてカラム名と内容を指定します。

例えば「カラムの値が存在するかどうか」のチェックでは、「{presence: true}」を使います。

models/post.rb

validates :content, {presence: true}

 

そして、文字数を制限したい場合は、lengthと{maximum: 数値}を使い、最大文字数を設定できます。

models/post.rb

validates :content, {presence: true, length: {maximum: 140}}

 

saveメソッドの戻り値と表示するページ切り替え

データ更新時にsaveメソッドで保存できた場合は「true」、保存できなかった場合は「false」を返します。

この戻り値を利用すれば、表示するページの切り替えの判定が可能です。

コントローラー

def update
  if @post.save
    # 保存できた場合
  else
    # 保存できなかった場合
  end
end

 

renderメソッド

データ更新に失敗してリダイレクトすると、フォームに入力していた値が消えてしまうが、renderメソッドを使えば別のアクションを経由せずに直接ビューの表示が可能です。

render(“ビューのフォルダ名/ファイル名”)で指定し、redirect_toメソッドと違ってそのアクション内で定義した@変数をビューでそのまま使えます。

例えばビューのフォルダ名が「posts」、ファイル名が「edit.html.erb」の場合は次の通りです。

コントローラー

def update
  @post = Post.find_by(id: params[:id])
  @post.content = params[:content]

  if @post.save
    # 保存できた場合
    redirect_to("/posts/index")
  else
    # 保存できなかった場合
    render("posts/edit")
  end
end

 

エラーメッセージ

saveメソッドでバリデーションに失敗した場合は、Railsでは自動的にエラーメセージが生成され、errors.full_messagesメソッドの中にエラー内容が配列で入ります。

ビューで表示するには、eachメソッドを合わせて使えば可能です。

<% @post.errors.full_messages.each do |message| %>
  <%= message %>
<% end %>

 

フラッシュ

ページに1度だけ表示されるメッセージをフラッシュと言い、ページの更新や別のページに移動するとフラッシュは表示されなくなります。

Railsでは特殊な変数「flash[:notice]」を使うとフラッシュを表示できますが、色々な箇所で共通で使うため、基本的にapplication.html.erbで表示します。

コントローラー

def update
  if @post.save
  else
    flash[:notice] = "表示したい文字列"
  end
end
application.html.erb

<% if flash[:notice] %>
  <div class="flash">
    <%= flash[:notice] %>
  </div>
<% end %>

※flash[:notice]は、1度表示された後に自動で削除される

 

render先で変数を使う場合

renderメソッドを使えば別のアクションを経由せずに直接ビューの表示が可能ですが、ビューのアクションで変数を定義していないとエラーが出る場合があります。

そんな場合は、newメソッドを使って変数を定義すれば、エラーを回避できる可能性があります。

def new
  @post = Post.new
end

 

値の重複チェック

データベースにすでに保存されている値で登録できないようにする(重複チェック)には、バリデーションで「uniqueness: true」を指定します。

validates :email, {uniqueness: true}

 



Ruby on Railsでテーブルにカラムを追加

既にあるテーブルに変更を加える場合は、マイグレーションファイルを作成後、ファイルに変更内容を記述し、ファイル内容を反映させます。

マイグレーションファイルのみを作成するには、「rails g migration」コマンドを使います。

例えばファイル名「add_image_name_to_users」(変更内容がわかるファイル名が望ましい)のマイグレーションファイルを作成するには次の通りです。

$ rails g migration add_image_name_to_users

コマンド実行後、db/migrateフォルダの中に「更新日時_add_image_name_to_users.rb」というマイグレーションファイルが作成されるので、変更内容を記述します。

例えばテーブルにカラムを追加したい場合は「add_column」を使い、usersテーブルにstring型のimage_nameカラムを追加するには次の通りです。

class AddImageNameToUsers < ActiveRecord::Migration[5.0]
  def change
    # 変更したい内容を記述
    add_column :users, :image_name, :string
  end
end

マイグレーションファイルを編集後、「rails db:migrate」コマンドで反映されます。

 

Ruby on Railsで画像を表示

ビューで画像を表示するには、publicフォルダの中に画像ファイルを保存し、それをビューで呼び出します。

ビューに表示する場合は、<img>タグを使います。例えばpublicフォルダの直下に画像ファイルがある場合は次の通りです。(@user.image_nameに画像のファイル名が代入されている場合)

<img src="<%= "/#{@user.image_name}" %>">

 

入力フォームから画像データを受け取る

入力フォームから画像データを受け取り、publicフォルダに保存する方法を説明します。

まず入力フォームに画像選択ボタン(typeがfile)を配置します。

<input name="image" type="file">

そして、フォームから画像を送信するには、form_tagの第二引数に{multipart: true}を指定する必要があります。

<%= form_tag("...", {multipart: true}) do %>
  <input name="image" type="file">
<% end %>

送信先のアクションで画像データを受け取り、Fileクラスのbinwriteメソッドを使って画像ファイルを保存します。(File.binwrite(ファイルの場所, ファイルの中身)

def update
  # 画像が送信された場合だけ実行する
  if params[:image]
    image = params[:image]
    File.binwrite("public/◯◯.jpg", image.read)
  end
end

※画像ではなく通常のテキストファイルの保存する場合は、File.writeを使います。

 

Ruby on Railsでログイン・ログアウト機能

例えばユーザーテーブルにメールアドレスやパスワードのカラムを持たせ、フォームからログインする機能が作れます。

パスワードを入力するフォームでは、<input>タグのtypeをpasswordにします。

<input type="password">

 

ログイン処理

ログイン処理では、ページを移動してもユーザー情報を保持し続けるために、特殊な変数「session」を使います。(session[:キー] = 値)

sessionに代入された値はブラウザ(GoogleChrome等)に保存され、ブラウザはそれ以降のアクセスでsessionの値をRailsに送信します。

例えばログインユーザーの情報を保持するには、ユーザーのidを代入します。

def login
  @user = User.find_by(email: "test@mail.com", password: "test123")
  if @user
    session[:user_id] = @user.id
    flash[:notice] = "ログインしました。"
    redirect_to("/posts/index")
  end
end

 

ログアウト機能

ログアウト機能を作るには、逆にsessionの値を削除します。

def logout
  session[:user_id] = nil
  flash[:notice] = "ログアウトしました。"
  redirect_to("/login")
end

 

sessionの値を変更する場合のルーティング

loginやlogoutではデータベースの変更はしませんが、sessionの値を変更するため、ルーティングではgetではなく「post」を使います。

get "login" => "users#login_form"
post "login" => "users#login"
post "logout" => "users#logout"

※上記の例では”login”は二つありますが、getとpostで異なるルーティングとして扱われます。

 

共通処理

各コントローラーの全アクションで共通の処理がある場合は、before_actionを使います。

これによりアクションが呼び出された際に必ずbefore_actionの処理が実行され、全アクションで共通する処理を1箇所にまとめることが可能です。

例えば現在のログインユーザを取得するような処理なら次の通りです。

applicaiton_controller.rb

class ApplicationController < ActionController::Base
  before_action :set_current_user

  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end
end

 

アクセス制限

URLを直接入力すると誰でもアクセスできるため、ログインしている場合、していない場合でそれぞれ適切なアクセス制限が必要です。

アクセス制限をするには、applicationコントローラbefore_actionを使って処理を共通化させます。

例えばログインしている場合としていない場合のアクセス制限に関する処理を、applicationコントローラに書きます。

applicaiton_controller.rb

class ApplicationController < ActionController::Base
  before_action :set_current_user

  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end

  # ログインしていない場合のアクセス制限
  def authenticate_user
    if @current_user == nil
      flash[:notice] = "ログインが必要です"
      redirect_to("/login")
    end
  end

  # ログインしている場合のアクセス制限
  def forbid_login_user
    if @current_user
      flash[:notice] = "すでにログインしています"
      redirect_to("/posts/index")
    end
  end
end

※@変数で定義した変数は、同じクラスの異なるメソッド間で共通して使用可能

 

そして、各コントローラーでbefore_actionを使いますが、特定のアクションのみで実行する場合はonlyを使います。

user_controller.rb

class UsersController < ApplicationController
  before_action :authenticate_user, {only, [:edit, :update]}
  before_action :forbid_login_user, {only, [:new, :create, :login_form, :login]}

end

※各コントローラはapplicationコントローラを継承しているため、継承元のメソッドを使えます。

 

編集を制限する

データを編集する機能がある場合は、他人のデータを勝手に編集できないようにする制限も必要になります。

例えば正しいユーザーか確かめる処理を追加し、before_actionでチェックします。

user_controller.rb

class UsersController < ApplicationController
  before_action :ensure_correct_user, {only, [:edit, :update]}
  
  def ensure_correct_user
    # ログイン中のユーザーidと編集したいユーザーidが等しくない場合
    if @current_user.id != params[:id].to_i
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end 
  end

end

※params[:id]で取得できるのは文字列のため、比較するにはto_iメソッドで数値に変換が必要

 



Ruby on Railsでモデルにインスタンスメソッドを追加

Railsではモデル内にインスタンスメソッドを定義でき、モデルのインスタンスに対して使えます。

models/post.rb

class Post < ApplicationRecode
  def user
    return User.find_by(id: self.user_id)
  end
end
posts_controller.rb

class PostsController < ApplicationController
  def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
  end
end

 

whereメソッド

テーブルから対象データを取得する際に、find_byメソッドでは1件だけ取得できますが、複数のデータを取得するにはwhereメソッドを使います。

posts = Post.where(user_id: 1)

 

Ruby on Railsでいいね機能

いいね機能を実装するには、「どのユーザー」が「どの投稿」をいいねしたかを記録するため、「user_id」と「post_id」2つのカラムを持つlikesテーブルを用意する。

そしてビューで表示する場合は、user_idとpost_idが合致するデータがlikesテーブルに存在するかをfind_byメソッドでチェックする。(find_byは該当データがない場合nilを返す)

 

コントローラーを手動で作る

「rails g controller」コマンドでコントローラーファイルを作る場合、一緒にビューファイルも自動生成されるが、ビューファイルが不要な場合は手動で作ることができます。

likes_controller.rb

class LikesController < ApplicationController
  def create
    @like = Like.new(user_id: @current_user.id,
                     post_id: params[:id])
    @like.save
    redirect_to("/posts/#{params[:id]}")
  end

  def destroy
    @like = Like.find_by(user_id: @current_user.id,
                         post_id: params[:id])
    @like.destroy
    redirect_to("/posts/#{params[:id]}")
  end
end

 

アイコンは「Font Awesome」を使う

「Font Awesome」とは、様々なアイコンをフォントとして利用できるようにしたもので、application.html.erbの<head>タグ内で読み込み用の<link>タグを追加する。

<head>

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">

</head>

 

ビューで条件分岐

いいねの表示はビューで条件分岐させるが、HTML要素に対してlink_toメソッドを使うには、<%= link_to(URL) do %>と<% end %>の間にHTML要素を書く必要があります。

<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
  <%= link_to("/likes/#{@post.id}/destroy", {method: "post"}) do %>
    <span class="fa fa-heart like-btn-unlike"></span>
  <% end %> 
<% else %>
  <%= link_to("/likes/#{@post.id}/create", {method: "post"}) do %>
    <span class="fa fa-heart like-btn"></span>
  <% end %>
<% end %>

 

countメソッド

対象データの件数を取得するには、countメソッドを使います。

@count = Like.where(post_id: 1).count

 

Ruby on Railsでパスワードの暗号化

パスワードをテーブルに持たせる場合は、安全性のために暗号化をすべきですが、gem(ジェム)を使うことで簡単に実装可能です。

gemとはRubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもので、「検索機能を作るgem」や「暗号化するためのgem」など様々なgemが存在します。

例えば「bcrypt」という暗号化のためのgemをRailsにインストールすれば、パスワードを暗号化ができます。

 

gemのインストール

gemをインストールするには、appフォルダ直下にある「Gemfile」に追記し、「bundle install」コマンドを実行します。

 

bcryptの使い方

bcryptをインストール後、例えばパスワードを扱うUserモデルにhas_secure_passwordを追加すれば、ユーザーを保存する際に自動的にパスワードを暗号化してくれます。

models/user.rb

class User < ApplicationRecord
  has_secure_password

  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness: true}

  def posts
    return Post.where(user_id: self.id)
  end
end

 

また、has_secure_passwordメソッドで暗号化したパスワードは、password_digestカラムに保存することになっているため、Userモデルのpasswordカラムは削除し、password_digestカラムを追加します。(カラムの削除はマイグレーションファイルで「remove_column」を使う)

ただし、パスワードを保存するのはpassword_digestではなく、passwordなので注意が必要です。(has_secure_passwordによってpasswordに代入された値が暗号化され、password_digestカラムに保存される)

user = User.find_by(id: 1)
user.password = "pas123"
user.save

 

尚、暗号化されたパスワードでログイン処理をするには、authenticateメソッドを使います。

authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定します。

def login
  @user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])
  end
end

 



最後に

Webアプリケーションを簡単に作るなら、フレームワークの知識が必須になります。

Ruby用のフレームワークとしてはRuby on Railsが一般的なので、Rubyを学んだ後はRailsの使い方もマスターしましょう。

 

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


【2024年】おすすめのゲーミングPC

モンハンワイルズの発売日とPC版(Steam版)の推薦スペックが公開されたので、おすすめのゲーミングPCをご紹介!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です