🌊

ruby on railsアプリ作成の座学

2023/12/09に公開

はじめに

以前にRuby on railsでのアプリ作成を個人で学んでいたときの備忘録です。

環境

Windows 11
VSCode

本篇

rails application 作成

rails new するときは-G オプションを指定することで.git および.gitignore ファイルを作成せずに実行できます。
rails new -G [appname]
これにより github に新規リポジトリとして追加する必要がなくなります。

サーバーの起動方法として

rails s
を実行する方法と
bin/rails server -b 0.0.0.0 -p 3000
のように ip address を bind して起動する方法があります。

開発モデルについて

基本的に MVC(Model, View, Controll)モデルで開発を行います。
Model はデータベースなどでデータを管理します。
View は HTML でデータを表示したり利用者からの画面入力を受け付けます。
Controll は Model からデータを読みだして成形して View に引き渡したり、View からデータを受け取って成形して Model に格納したりします。

update wsl (未解決)

rails s で動作させようとしたところ bundler の version が古いと言われたのでアップデートしようとしたところ、permission エラーが出される。
rbenv で ruby を管理することにする
参照元 ↓

rbenv install -l
によってインストール可能な version を調べた。
rbenv install 3.0.6 をインストールした。(2023/08/04)

myapp/.ruby-version
ファイルの内容を変更して system の設定を変更
~/.bashrc の内容に以下を追加

[[-d ~/.rbenv]] && \
 export PATH=${HOME}/.rbenv/bin:${PATH} && \
 eval "$(rbenv init -)"

これで ruby と gem が rbenv のパスをさすようになる

その後

gem update --system
gem update
bundle update

によって update 完了
bundler -v
で確認

スネークケースとキャメルケース

スネークケース
ruby_on_rails
キャメルケース
RubyOnRails

rails では原則
クラス:キャメル
それ以外:スネーク
ただし、定数はすべて大文字

controller の作成

rails g controller Home index

Home コントローラを作成し、index アクションを追加
config/routes.rb に get 要求として追加
controller 及び views の追加がある。
rails s したときの server:port/controller_name/action_name で参照できるっぽい?

*.html.erb の編集

config/routes.rb にルーティングを追加していくことで、ページの移行が可能になった。
root 設定をすることで、IP:port のみでアクセスしても root 設定したページに飛ぶようになる。

css の設定

app/assets/stylesheets に common.css を追加し css を記述した。
default ではすべての css ファイルが読み込まれるため、設定が反映された。

db の設定

rails では model を作成することで DB の作成が可能である。
rails g model User name:string age:integer
のようにして User データベースを作成することができる。
すると、migrate ファイルと models ファイルが作成される。

rails db:migrate

を実行すると、migrate ファイルに基づきテーブルが作成される。

sqlite3 へのアクセスは、

sqlite3 db/development.sqlite3

で可能。終了は.exit or .quite or ctrl+Dである。
データテーブルの形式へのアクセスは.schema usersのようにして可能である。

上記の設定ではテーブルに

id(integer, PRIMARY KEY AUTOINCREMENT NOT NULL) 主キー
created_at(datetime(6) NOT NULL) 作成日時
update_at(datetime(6) NOT NULL) 更新日時

が自動で追加される。

変更した場合は実行済みのために更新ができないため、
rails db:drop //permission エラーがでる
del development.sqlite3
で直接データベースを消せる。
これ以外にも rails db:reset rails db:migrate:reset が対象らしい。

rails db:create
rails db:migrate

をして db を一度消す方法を利用した。

モデルの使用

rails c

コマンドで rails 環境で ruby を実行可能
User.create(name: "A", age: 10)
で name A,age 10 のデータが追加される。
これは create 内に activerecord があることが理由。
つまり、rails は activerecord というモデルを使用しているということ。
User.create(name: "B", age: 20)

User.all

ですべての User データ表を表示

user = User.find(1)
user

とすると、User id = 1 である A のデータがとられる。
このデータを表示することで、確かめられる。
user.name や user.age, user.id でそれぞれのカラムにアクセス可能
user.name に代入などもかのうだが、update されていないため、

user.save

を実行することで、データベースの update が可能

User.where("age>=19")

のようにすることで検索も可能
これ以外の SQL 文については gg ればよい
rails c は exit で終了可能

<% if true %> #出力されない(%=なし)
<% end %>

routes には to 以外に as もあり、名付けができる。

rails routes
では routing の動作などを見れるものがある。
特定の結果を参照するばあいは、
rails routes | grep \*\*\*
(win にはないので grep -> findstr を使用)
のようにすればよい。

リレーション

(db)1:*を表すときに Model を
1 側=多数を持つものに対しては
has_many
*側=特定の相手を持つ者に対しては
belongs_to
とする。

  • app/models/user.rb, weight_history.rb

crud の作成

rails g scaffoldコマンドでは、自動的に CRUD の機能を作成できる。
CRUD = (Create, Read, Update, Delete)
db のカラム作成には、references があり、外部キーとして動作する。
ruby で render "form"とすると、 = 部分テンプレート
_form.html.erb(テンプレート)を呼び出せる

  • app/views/weight_histories/new.html.erb
    controller で.permit のようにデータを限定している。
    これは、それ以外の形式のデータを受け付けないことで、アプリの予期しない動作がなくなる。
    2 行目の before_action は前処理であり、only で指定した 4 つ(show, edit, update, destroy)の呼び出し前に処理される。
  • app/models/weight_history.rb

resetful と http メソッド

GET,POST 以外に PATCH や PUT,DELETE などの http メソッドがある。

  • rails routes | findstr weight などで確認できる。
    rails 内ではこれを GET や POST に変更する。
    resources によって routing がすべて作成される。
    ルーティングの便利技として、アクションがいらないときは
    resources :\*\* , except:[:index, :destroy]
    だったり、それだけいるときは
    except -> only にするとよい。
  • config/routes.rb

バリデーション

  • app/models/weight_history.rb
    入力フォームの必須入力や入力可能な長さなどの情報を与えることが出来る。
    presence や length は rails にあるものであるが、
    weight_validate のように自作も可能.
    rails では create or update or save のような sql を発行する文が実行される。
    つぎに、validation が実行され、入力データのチェックがされる。
    そして、SQL が実行される。
    これが、ActiveRecord の実行の流れ。

コールバック(フック)

実行中に他のものを実行させることができる。(before_validation など)

  • app/models/weight_history.rb
    また、rails の db において model ファイル内ではカラム名だけでアクセスすることが可能だが、代入時は self.をつける必要があるため注意!!

view の拡張と Helper

現在のままでは User が id で表示されているためわかりずらい。
そこで、UserName が出てほしい。

  • app/weight_histories/show.html.erb
    をみると、weight_history に render しているため_weight_history.html.erb を編集する。
    今回のモデルでは belongs_to :user とあるため、
    User を user_id から user にすると user モデルにアクセスできるため、user.name にすることでユーザー名になる。

つづいて、weight(体重)の表示が数値のみであるため、修正する。
条件によっていくつか表示する文字を変更したい場合は、view に直接書かずに Helper でかく。Helper とは View から呼ばれるメソッドを保持できる場所。

  • app/helpers/weight_histories_helper.rb
    class ではなく module である。
    これを変更してメソッドを追加することで複雑な拡張が可能である。

その他知識

RAILS_END = 環境を表す変数(環境変数)

・ production = 本番
・ development = 開発
・ test = テスト
これによって db の接続先を変更できる。migrate の実行時は、rails db:migrate RAILS_ENV=testのように変更ができる。(初期値は development であり、development は省略可)

gem

gem file は、ruby package のことであり、パッケージは既に作成された機能のことである。

  • gemfile
    gemfile 内に利用する gem を追記していけばそれらを利用することが出来る。
    (追記した際は、bundle install を忘れずに)

binding.pry というデバックツールがあるため、便利である。

seed

  • db/seeds.rb
    rails db:seedを実行することで初期データを作成可能

参考資料

https://youtu.be/IyEcu9e1YgM

GitHubで編集を提案

Discussion