renderメソッドとは何か
renderメソッドとは
呼び出すビューを指定することができるメソッド。
通常Railsではコントローラのアクションが動くと同名のビューが呼び出されるが、そうでないビューを呼び出したい場合はこのrenderメソッドを使う。 コントローラでもビューでも使用可能。
ちなみに呼び出されたビューはerb(もしくはhamlかslim)からhtmlに変換された後、ブラウザに読み込まれて画面に描画される。 このhtmlファイルをブラウザが読み込んで描画するまでの流れを(ブラウザ)レンダリングと言う。
レンダリングはLoading、Scripting、Rendering、Paintingという4つの工程に分けられるとのことだが、脱線するのでここでは省略する。
コントローラでの主な使われ方
何かユーザーが入力したデータを保存したい時などに、saveメソッド、redirect_toメソッドと併せて使われる。 例えばこんな感じ。
def new @task = Task.new end def create @task = Task.new(task_params) if @task.save redirect_to tasks_url, notice: "タスク「#{task.name}」を登録しました" else render :new end end
上記のコードでは、saveによる検証結果がvalidationに引っかからずtrueであればredirect_toが動き、falseであればrenderが動く流れとなっている。
後者の場合だと、renderはコントローラのアクションを経由せずにビューをレンダリングするので、ユーザーが入力したデータを残したまま再びnewのビューが描画されることとなる。より細かくいうと、newアクションの@task = Task.newが実行されず、入力値を保持したcreateアクションの@taskがそのままnewのビューに渡されるので同じ状態の見た目が再びレンダリングされるという流れ。
ちなみに前者の場合だと、redirect_toによりtasks_url向けのHTTPリクエストが送信され、indexアクションを経由したのちindexビューがレンダリングされる。
ビューでの主な使われ方
ビューでrenderメソッドを使うのは部分テンプレートを呼び出す場合がほとんど。
部分テンプレートとは複数のビューの共通部分として作成するビュー。 これは「ソフトウェア開発全体において情報を重複させない」というRailsのDRY原則に基づいた手法。
renderメソッドを使って部分テンプレートを呼び出す際は、部分テンプレートを呼び出していることを明示的にするためにpartialオプションを使用する。こんな感じで。
<%= render partial: 'ファイル名' %>
参考
【Rails】renderメソッドの使い方を徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
マイグレーションでできることのまとめ
マイグレーションとは
SQLを直接使わずに、データベースのテーブルやカラムを変更できる仕組み。 変更の1つ1つをRubyのファイル(マイグレーションファイル)として実現している。
マイグレーション作成コマンド
$ rails generate migration クラス名
クラス名は何でもOKだが、基本は「すること+テーブル名」。 例えばUserテーブルのhogeカラムを変更したい場合は ChangeHogeToUser で、Userテーブルを削除したい場合は DropUser となる。
マイグレーションでできること
マイグレーションを可逆的にする(up, down)
upはマイグレーション実行時に実行され、downはロールバック実行時に実行されるメソッド。 下記のコードでは、マイグレーションを実行するとテーブルが削除され、ロールバックを実行すると元のテーブルが復元される。
class DropUser < ActiveRecord::Migration[5.0] # 変更内容 def up drop_table :users end # 変更前の状態 def down create_table :users do |t| t.string :uuid t.string :name t.timestamps end end end
テーブル名の変更
下記のコードではテーブル名をissuesからtasksに変更している。
class RenameIssueToTask < ActiveRecord::Migration def change rename_table :issues, :tasks end end
既存カラムの変更
下記のコードではUserモデルのuuidカラムをNOT NULL制約に変更している。
class ChangeColumnToUser< ActiveRecord::Migration def up change_column :users, :uuid, :string, null: false, default: 0 end def down change_column :users, :uuid, :string, null: true, default: 0 end end
既存カラムを変更する際のオプション
①NULL / NOT NULL
# NULL change_column :テーブル名, :カラム名, :型, null: true # NOT NULL change_column :テーブル名, :カラム名, :型, null: false
②インデックス
特定のカラムからデータを取得する際に、そのカラムのデータを複製して検索を行いやすくするためのもの。例えばUsersテーブルのnameカラムにインデックスを張ることで、アルファベット順にnameを並べ替えて検索しやすくしてくれる(並び替えた後にどういった検索処理が行われるのかはよく分かってない)
change_column :テーブル名, :カラム名, :型, index: true
③デフォルト値
change_column :テーブル名, :カラム名, :型, default: "piyo"
④長さ
change_column :テーブル名, :カラム名, :string, limit: 12
⑤小数部の精度を指定する
change_column :テーブル名, :カラム名, :型, precision: 6
カラム名の変更
class RenameAgeToNenrei < ActiveRecord::Migration def change rename_column :User, :age, :nenrei end end
カラムを追加/削除する
class AddColumnToUser < ActiveRecord::Migration def change # 追加 add_column :users, :piyo, :string # 削除 remove_column :users, :piyo, :string # まとめて削除 remove_columns :users, :column_1, :column_2 [, ...] # 追加する場所を指定する場合 add_column :users, :piyo, :string, :after => :uuid end end
インデックスを追加/削除する
複合ユニークの使い所は、例えばユーザAから投稿Aへのいいねなど。この組み合わせは一意にしておかないと、この例で言うと同じユーザが1つの投稿に何度もいいねできることになる。
class AddIndexToUser < ActiveRecord::Migration def change # 追加 add_index :users, :name # ユニーク追加 add_index :users, :name, :unique => true # 削除 remove_index :users, :name # 複合インデックスの場合 add_index :users, [:name, :name2] # 複合ユニークの場合 add_index :user_accounts, [:provider, :uid], :unique => true end end
外部キーを作成/削除する
外部キーとは、テーブル同士の紐づけに用いるカラムのこと。usersテーブルとpostsテーブルがあったとして、このpostはどのuserが投稿したものなんだろう?というのをpostsテーブルで確認したい時に、user_idのカラムを用いる。user_idはusersテーブルでは主キーと呼ばれる。
class CreateUserAccounts < ActiveRecord::Migration[5.0] def change create_table :user_accounts do |t| t.references :user, index: true, foreign_key: true t.timestamps end end end
モデル作成時に作成する場合 $ rails g model UserAccount user:references
class AddRefUser < ActiveRecord::Migration def change add_reference :users, :article, foreign_key: true # 外部キーの削除はこちら remove_foreign_key :users, column: :article_id # カラムも一緒に削除する場合はこちら remove_reference :users, :article, foreign_key: true end end
既存のテーブルに追加する場合 $ rails g migration AddArticleToUsers article:references
ポリモーフィックを作る
ポリモーフィックとは、複数の異なる型やオブジェクトに対して共通のインタフェース(Rubyの世界でならメソッドと言い換えてもよさそう)を提供すること。すごく単純化して言うと、同じ名前のメソッドがそれぞれ異なるクラスで規定されていること。もちろんそのメソッドの内容はそれぞれ異なる。ダックタイピングの一種。
class CreateMessages < ActiveRecord::Migration[5.0] def change create_table :messages do |t| t.references :messagable, polymorphic: true t.text :message t.timestamps end end end
モデル作成時に作成する場合:$ rails g model message messagable:references{polymorphic} message:text
実際にポリモーフィックを利用したコードは例えば以下のような感じ。 EmployerとEmployee、どちらもsender_nameという同じ名前のメソッドを所有しているが、 どちらのsender_nameを使う際もコードはMessage.find(params[:id]).messageable.sender_nameとなる。
class Message < ApplicationRecord belongs_to :messageable, polymorphic: true end class Employer < ApplicationRecord has_many :messages, as: :messageable # 共通のインターフェース def sender_name company_name end end class Employee < ApplicationRecord has_many :messages, as: :messageable # 共通のインターフェース def sender_name "#{last_name} #{first_name}" end end
参考
サーバーレスアーキテクチャの概要
こんにちは。
初めて投稿します。りんだです。
現在プログラミングを勉強している非エンジニアです。
このブログでは、自分がプログラミングを学んでいく中で、分かったことや分からなかったことを少しずつ整理していきたいと思っています。
同じくプログラミング初学者の方や、現役エンジニアの方から記事の内容にコメントいただけたりするとありがたいです。よろしくお願いします。
ということで、初めての今日はサーバーレスに関する基本的な情報をまとめていきたいと思います。
従来のサーバーまわりの構成もいまいち分かっておらず、もちろん業務で触ったこともない自分が本来手を出していい領域ではないかもなのですが、、
今週から知り合いのエンジニアの方にこの領域について学ばせていただけることになったので、教わる前に何かしておこうということで基本の情報を整理してく次第です。
まずサーバーとは
サーバーとは、ネットワークを介して他のコンピューターに情報を提供するコンピューターのことです。
一方で情報をもらう側のコンピュータのことをクライアントと言い、これらが相互に通信し合う仕組みをクライアントサーバモデルと言います。
クライアントの役割は「情報を要求する」「ユーザに情報を提示する」に限られるのに対し、サーバーの役割は多様です。
そのためネットワーク上には、Webページを表示するための情報(HTML, CSSなど)をクライアントに提供するWebサーバー、クライアントから送信されたドメインを受け取ってそれに紐づいたIPアドレスを教えてくれるDNSサーバーなど、様々なサーバーが存在します。
で、サーバーレスとは
言葉だけ見るとサーバーが存在しない構成なのかなと思えますが・・・
そうではなく、サーバーの存在を意識しないでいい構成のことをこう呼ぶようです。
ではサーバーの存在を意識しないでいいとはどういうことなのでしょう。
通常、何かWebサービスを運営していく際には、サーバーに関する以下の作業を行う必要があります。
- サーバーの立ち上げ
- サーバーの運用
- サーバーの保守
立ち上げとは、オンプレミスかクラウドによるサーバーの用意をしたのち、サーバーにミドルウェアのインストールなどをする作業のこと。
運用とは、システムが停止しないようにする作業のこと。
保守とは、システムの改修や修理のことを指しています。
これまでエンジニアはこれらの作業をすることに時間を取られていました。
しかしサーバーレスな構成を採用すると、これらの作業をクラウドの提供会社に任せることができるため、サーバーの存在を意識することなく、本来最も優先度の高い作業であるサービスの開発に専念することができるのだそうです。
サーバーレスは他にどんなメリットがあるのか?
イベントドリブン
従来のサーバーは基本的に常時稼働していましたが、サーバーレスアーキテクチャでは何らかのイベントが発生したときにだけサーバーが稼働します。
イベントとは、例えば、Webぺージやアプリでボタンが押される、ファイルがアップロードされる、データベースにデータが追加される、といった事例です。
イベントが発生していないときは機能は実行されず、サーバーがリクエストを待ちながらずっと稼働するようなこともありません。利用者が行うことは機能の開発と、それを駆動させるトリガーを設定することだけで、あとは全てクラウドの提供会社に任せることができます。
サーバーレスのデメリット
遅延
ネットワークを介して処理が実行されるため、遅延が生じることがあります。
ベンダーロックイン
AWSやMicrosoft、Googleなどがサーバーレスのサービスを提供していますが、それぞれかなり独自の技術・仕様となっています。
そのため、一度開発したものを他社のクラウドに移行することが難しかったり、新たな仕様を理解するための学習コストがかかったりします。
参考
なぜ今はサーバレスの時代か?ーーそのメリットと従来型の開発と比較 | Fixel株式会社
サーバーレスの理解とメリット・デメリット(2020年版) - Qiita
ゼロから学ぶサーバーレスアーキテクチャ(FaaS)入門 | サーバーレスのメリットやAWS事例
https://pages.awscloud.com/rs/112-TZM-766/images/20200827_serverless_essential.pdf