初めに
これはRailsを触っている中で疑問に思ったことをただメモするだけのものになります。
少しFlaskをかじっていたので「Flaskでいうところの...」みたいな表現多め。
MVCモデルって何
Model、View、Controllerのそれぞれの頭文字からきているモデルのこと
Modelの役割
データを処理したりする部分のこと。Controllerとデータベースの仲介役的な立ち位置。
Viewの役割
ユーザーが実際に見る画面のこと。HTMLとかの部分。
ユーザーのリクエストをControllerに渡す役割もある。
Controllerの役割
ViewとModelの間にいる存在。司令塔的な立ち位置。
ViewからのリクエストをModelに指示したりする。
まとめ(個人的解釈)
Viewが注文(リクエスト)を受け取りControllerに送る。
Controllerは送られた注文をもとにModelに注文の商品(データ)をとってくるように指示。
Modelは指示された内容のデータをデータベースからとってくる。
みたいな流れ。
gemって何
- RubyGemsが公開しているパッケージのこと
- パッケージを管理しているシステムの名前
らしい。
Pythonでいうpipとかconda的な感じかな?
Gemfile
gemパッケージを管理するためのファイル。環境に必要なパッケージがまとめられているやつ。作成したいRailsアプリのルートディレクトリに初めから入っている。
gem 'gem名','バージョン指定'
こんな感じでgem名とバージョンがまとめられている。
bundler
gemの一種で複数のgemのパッケージ間の依存関係を保ちながらパッケージをインストールしてくれるやつ。これのおかげでバージョン間のトラブルを避けることができる。
bundle install
このコマンドでGemfileに入っているパッケージをインストールしてくれる。
Ruby on Rails
プログラム言語Rubyで動くwebアプリケーションフレームワークのこと。
PythonでいうとことのFlaskとかDjangoみたいなもん。
Rubyでよく使う構文
Pythonでいうfor文
配列.each do |変数名|
do忘れがち。
Railsでアプリケーションを作成する方法
アプリ開発に必要最低限なファイルはRailsのコマンドを使って作成する。
rails _Railsのバージョン_ new アプリケーション名
Railsのバージョンはrails -vで確認できる。アプリケーション名は任意。
実行すると指定したアプリケーション名のフォルダが作成される。そのフォルダの中にアプリ開発に必要なファイルやフォルダも同時に作成されている。
データベースの作成方法
Railsでのデータベースの作成は以下のコマンドを使う。
rails db:create
作成されるデータベースはconfig/database.ymlにあるファイルをもとにして作られるらしい。初期はsqlite3でデータベースが作成されるぽい。
データベースを作ったら次にこのコマンドを実行する。
rails db:migrate
これでデータベースの作成はおしまい。
ここでデータベースに変更を加えることができる。何かしらデータベースに追加とか削除をするときにはこのコマンドを使ってデータベース側に変更を加えますよ宣言をする必要がある。
具体的にはmigrateファイルのchangeメソッドを実行するためのコマンド。
データベースの初期化
rake db:migrate:reset
このコマンドで全レコード削除からのテーブルを再構築
rake db:seed
このコマンドでseeds.rbに書いてあるコードを実行
すでにあるテーブルにカラムを追加するコマンド
migrateファイルの作成をする。
rails g migration migrateファイル名
作成したファイルのchangeメソッドに追加カラムの情報を入れる
def change
add_column :テーブル名, :追加するカラム名, :追加するデータ型
end
最後に変更を反映(changeメソッドを実行)
rails db:migrate
マイグレーションって何
Controllerの作成方法
Controllerの作成には以下のコマンドを使う。
rails g controller コントローラー名
実行するとapp/controllersフォルダに指定したコントローラー名のファイルが生成される。コントローラー名_controller.rbっていうフォルダ名になっているはず。
コントローラー名は複数形の単語が好ましい
Modelの作成方法
ここではModelを作成していく。イメージ的にはデータベースが一つのエクセルファイルだとして、ここはシートを作成する感じ。
モデル名には単数形の単語にするのが命名規則。
頭文字は大文字
rails g model model名 カラム名:データ型 カラム名:データ型 カラム名:データ型...
作成したら以下のコマンドでデータベースに変更反映
rails db:migrate
model名がいわゆるシート名みたいな感じ。カラム名は列名を指定している。データ型は入れるデータの形を指定する。
- string : 文字列(1~255文字)
- text : 長い文字列(256~4294967296文字)
- integer : 整数(4バイト)
- bigint : 整数(8バイト)
- float : 浮動小数
- decimal : 精度の高い小数
- datetime : 日時
- timestamp : タイムスタンプ
- time : 時間
- date : 日付
- binary : バイナリデータ
- boolean : Boolean
Viewの作成方法
コントローラーを作成するとapp/viewsの中に指定したコントローラー名のフォルダが作成されるので、このフォルダにファイルを追加していく。ファイルの拡張子は.html.erbという少し特殊なやつ。Ruby対応HTML的な感じ。
ファイル名はコントローラーで指定するアクションと同じ名前にすること。そうすることでアクションを実行したら同じ名前コントローラー名のフォルダの中の指定したアクションと同じ名前のViewのファイルが表示される。
Flaskでいうrender_templateが実行されるイメージ。
<%= これで囲むとHTMLに表示されるRubyを埋め込むことができる %>
<% これで囲むとHTMLに表示されずにRubyを埋め込むことができる %>
ルーティングの書き方
config/routes.rbのファイルでルーティングを決めていく。
書き方はこんな感じ。
HTTPメソッド 'URL' => 'controller名#action名'
HTTPメソッドにはget``post``patch``deleteが入る。
URLの部分はルーティングの部分。
Flaskでいう@app.route('/')の部分。
ルーティングは上から探索されるので順番には注意すること。
:idのような変数を扱うルーティングは最後に書くこと。
Controllerでの操作
class controller名Controller < ApplicationController
def index
end
end
こんな感じで関数みたいにして書いていく。これはFlaskと似ている。
ただFlaskみたいにrender_templateしなくても関数と同じ名前のViewファイルに画面遷移してくれる。賢い。
action内での変数定義の違い
action内での変数定義には二つやり方がある。
@変数名
変数名
@が先頭につく変数はViewで使うことができる。
@がつかない変数はViewで使うことはできない。そのアクション内でのみ使用可能。
params
paramsはpostされた情報、あるいはURL内の変数の情報が入っている。
params内の変数を指定することで特定の情報を取り出せる。
params[:変数名]
session
ログインしたときなどにユーザー情報を保持するための変数。
この場合データベースに保存されず、ブラウザ側に保存されログイン中は情報と一緒にこのセッション情報もブラウザから送られる。
session[:キー名] = 値
ログアウトするときにはこのセッションを破棄する(空にする)ことで実現できる。
session[:キー名] = nil
セッションの値をnilにすることで値を空にすることができる。
application_controller
これはすべてのコントローラーに共通する処理をまとめることができる。
before_action
これはアクションを行う前に実行されるアクション
before_action: 関数名
def 関数名
処理
end
こうすることでアクションが実行される前に指定した関数名のアクションを実行することができる。
Viewでの操作
link_to
.html.erbファイル内に
<%= link_to '表示したい文字' controller名_action名_path%>
と指定することで。controller名の指定したaction名が実行される。
Pythonでいうurl_forで関数名を指定するイメージ。
link_toの部分はコンパイルされたとき実際のView上ではaタグとして生成される。
またこの時のHTTP通信はGETのみ対応している。そのためPOSTに対応させるためには以下のように設定する。
<%= link_to '表示したい文字' controller名_action名_path, {method:'post'}%>
form_for
View上で入力フォームを作るときに用いる。ユーザーが入力した値を変数にまとめてコントローラーに送る。
この時送り先は指定しなくても勝手にcreateというアクションに飛ぶようになっている。すでに情報を持っている場合はupdateというアクションに飛ぶ。
<%= form_for @変数名 fo |f| %>
<!-- form内容 -->
<% end %>
form_forを使うときはコントローラー側で以下のように変数を設定する。
def new
@変数名 = モデル名.new
これでデータベースに登録するためのレコードを新規で作って変数に代入している。
form内容の種類
#{式・変数}
これを使うことで変数や式を展開し一つの値に戻すことができる。
redirect_to
このコマンドで既存のViewに対応したURLを指定することで指定したViewにリダイレクトすることができる。
def index
redirect_to('指定のURL')
end
Modelでの操作
validate
これを指定することで追加するデータの制限を加えることができる。
validate :カラム名, {presence:true}
これは空のデータを受け付けない設定。
validate :カラム名, {length,{maximum:140}}
これは文字数の最大を140とする設定