どんな人向けの記事か
- Railsを学び始めて間もない人
- Railsで初めてアプリを作ろうとしている人
- Rails慣れはしているけど少し復習したい人
どんな記事か
Rails初学者である筆者が、先日修了したprogateのRailsコースで学んだことを並べていく記事です。
ところどころ他記事の情報で補完しているため、progate運営が表現・説明した内容とは異なる箇所もそれなりにあります。
各種概念
サーバー
クライアント(ブラウザ)の要求に応じてデータを提供するコンピュータ。
Railsで作ったアプリをブラウザで表示するためには、このサーバーを起動させる必要がある。
ビュー
ページの見た目を作るためのHTMLファイル。ブラウザとRailsのやりとりの中で、Railsからビューが返されることで、ページが表示される。
拡張子は.html.erb
。erbはEmbedded Rubyの略で、HTMLファイルにRubyスクリプトを埋め込むための仕組み。
下記のコントローラ・ルーティングと同様に、ページを作成するのに必要な3つの要素のうちの1つ。
コントローラ
ブラウザにビューを返すためのもの。コントローラは目的に合わせてそれぞれ作成される。
例えば投稿に関する機能とユーザーに関する機能はそれぞれ別のコントローラファイルで規定される。
アクション
コントローラ内の、ブラウザに返すビューを見つけ出すための機能。コントローラファイル内でメソッドとして表現される。
ルーティング
送信されたURLに対して、「どのコントローラ」の「どのアクション」で処理するかを決める、対応表のようなもの。
データベース
データを保存しておくための場所。
テーブル
データベース内でデータを管理している表。行ごとのデータをレコード、列ごとのデータをカラムと呼ぶ。
モデル
データベースとのやりとりを行うクラス。モデルのインスタンスを作り、それを保存する工程を経ることでデータをテーブルに格納できる。
マイグレーションファイル
データベースに変更を指示するためのファイル。
コーディング
###ビューファイルで使うコード
####<% %>
ex)<%= @post %>
HTMLファイルにRubyコードを埋め込む際に、コードの前後に表記する。コードをブラウザに表示させたい場合は、コードの前後に<%= %>
と表記する。
####link_toメソッド
<%= link_to("表示する文字", "URL") %>
ex) <%= link_to("投稿一覧", "/posts/index")%>
リンクを作成する。HTMLファイルで使う。
第3引数に{method: "post"}を追加することで、postとして定義されているルーティングにマッチするようになる。
####form_tag
<%= form_tag("URL") do %>
データ
<% end %>
ex)
<%= form_tag("/posts/update") do %>
<textarea name="content"><%= @post.content %><textarea>
<input type="submit" value="投稿">
<% end %>
フォームに入力されたデータを、指定したURLに送信することができる。
しかしform_tag単体では意味がなく、textareaタグ(またはinputタグ)にname属性を指定することにより、name属性をキーとしたハッシュをアクション側に伝えることができる。
余談だが、上記のようにtextareaタグの間に値を置いておくことで、フォームを再入力する際にもともと入力していた内容の続きから入力できたりする。
####errors.full_messages
<% インスタンス名.errors.full_messages.each do |message| %>
<%= message %>
<% end %>
ex)
<% @posts.errors.full_messages.each do |message| %>
<%= message %>
<% end %>
エラーメッセージを出力する。saveメソッドを呼び出した際にバリデーションに失敗すると、Railsでは自動的にエラーメッセージが生成されるようになっているため、each文を用いることですべて表示することができる。
####yield
<%= yield %>
各ビューファイルは、application.html.erb内に表記されたyieldに代入される。
application.html.erbはサイト全体に適用するレイアウトを記載するビューファイル。
###コントローラファイルで使うコード
####@変数
@post = "hogehoge"
コントローラファイルで定義をすると、ビューファイルでRubyコードの埋め込みをする際に利用できるようになる。
####newメソッド
モデル名.new(カラム名: 値)
ex) post = Post.new(content: "hogehoge")
モデルからインスタンスを作成する。
####saveメソッド
インスタンス名.save
ex) post.save
作成したインスタンスをテーブルに保存する。
####allメソッド
モデル名.all
ex) posts = Post.all
テーブル内の全てのレコードを取得する。
####find_byメソッド
モデル名.find_by(カラム名: 値)
ex) post = Post.find_by(id: 1)
ある条件に合致するデータを1つ取得する。
####whereメソッド
モデル名.where(カラム名: 値)
ex) posts = Post.where(id: 1)
ある条件に合致する複数のデータを取得する。
####redirect_toメソッド
redirect_to("URL")
ex) redirect_to("/posts/index")
指定したページに転送することができる。
####renderメソッド
render("フォルダ名/ファイル名")
ex) render("posts/edit")
別のアクションを経由せずに、直接ビューを表示することができる。
データの保存に失敗したときなどによく使われる。
####orderメソッド
モデル名.order(カラム名: :並び替えの順序)
ex) @posts = Post.all.order(created_at: :desc)
取得したデータの並び替えを行う。:desc は降順、:asc は昇順を表す。
####destroyメソッド
インスタンス名.destroy
ex) post.destroy
指定したデータ(インスタンス)をデータベースから削除する。
####変数session
session[:キー名] = 値
ex) session[:user_id] = @user.id
ページを移動してもログインユーザーの情報を保持し続けるためのもの。
nilを代入するとログイン状態ではないようにすることができる。
####params
ex1) @id = params[:id]
ex2) @post = Post.new(content: params[:content])
用例1. ルーティングで設定したURLの :○○ の値を取得する。
用例2. name="○○"がついたフォームの入力内容を受け取る。
###before_action
before_action 全アクションで共通する処理
ex) before_action :set_current_user, {only: [:edit, :update]}
どのアクションを呼び出す前でも、必ず記述した処理が実行される。ファイルの一番上に記述する。
{only: [:アクション名]} を用いることで、処理が実行されるアクションを限定することができる。
###ルーティングファイルで使うコード
getメソッド
get "URL" => "コントローラ名#アクション名"
ex) get "/posts/index" => "posts#index"
指定した情報を取得する。データベースを変更しない場合は大体getを使う。getと下記のpostは、HTTPメソッドと呼ばれている。
postメソッド
post "URL" => "コントローラ名#アクション名"
ex) post "/posts/create" => "posts#create"
データベースを変更する際、sessionの値を変更する際に使うメソッド。
HTTPメソッドは他にもいろいろあるらしいが、まだ学んでいないのでここでは省略。
名前付きパラメータ
get "posts/:id" => "posts#show"
ルーティングのURL部分に : で始まる文字列を置くと、その文字列はパラメータとして認識される。
そのため、この例でいえば、/posts/○○ のようなすべてのURLをshowアクションに誘導することができる。
その関係で /posts/index のようなルーティングは、/posts/:id のルーティングに引っかからないようその前に記述する必要がある。
###モデルファイルで使うコード
####validates
validates :検証するカラム名, {検証する内容}
ex) validates :content, {presence: true}
不正なデータがデータベースに保存されないように、データをチェックする(バリデーション)。
主な検証内容は以下の通り。
検証内容 | 意味 |
---|---|
presecse: true | そのカラムの値が存在するかどうかをチェックする |
length: {maximum: 文字数} | 規定した文字数以上のデータは保存できないようにする |
uniqueness: true | 重複したデータがデータベースに存在するかどうかチェックする |
###マイグレーションファイルで使うコード
add_column :テーブル名, :カラム名, :データ型
ex) add_column :users, :image_name, :string
既存のテーブルにカラムを追加する。changeメソッドの中に書く。
コマンドライン
-
rails new アプリ名
入力したアプリの名前と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意される。
-
rails server
サーバーの起動。
-
rails g controller コントローラ名 アクション名
コントローラの作成。gはgenerateでも可。
コントローラ名とアクション名は、HTTPメソッド(URL)と同じ名前を付けることが多い。
-
rails g model モデル名 カラム名:データ型
マイグレーションファイルとモデルファイルの作成。
モデル名は単数形かつ一文字目を大文字にする。
-
rails g migration ファイル名
マイグレーションファイルのみを作成。
ファイル名は add_image_name_to_users などの分かりやすい名前にする。 -
rails db:migrate
データベースへのマイグレーションファイルの反映。
マイグレーションファイルを作ったのにこれを実行しないとエラーが発生する。
##まとめ
progateはよいです。
##参考にした記事
##参考にした書籍