2006.1.21 に Rubyist九州 Meeting 第1回にて発表した, Ruby on Rails のスライドです。2005年12月に Rails 1.0 が出ました。その前後, 同月に初めて Railsに触ったので、まだほんの初歩的、序の口のところです。
[2021.5] ざっと現代の状況に更新。Ruby 3.0 + Ruby on Rails v6.1. サンプルコード netsphere / rails-examples · GitLab
テーブルとテーブルとの関係性をリレーションシップという。よく書き間違いがあるが, 「リレーション」とはテーブルの定義を指し、関係性ではない。リレーションの関係性とか関連付けをリレーションシップという名前で呼ぶ。
Rails では, モデルクラスに, 関係性を書く。
has_one
:相手テーブル名の単数形
has_many
:相手テーブル名
belongs_to
:相手テーブル名の単数形
has_and_belongs_to_many
:相手テーブル名
has_many through:
多対多をやってみよう。tag
モデルを作る。
$ rails g scaffold tag name:string Running via Spring preloader in process 5206 invoke active_record create db/migrate/20210719132128_create_tags.rb create app/models/tag.rb invoke test_unit create test/models/tag_test.rb create test/fixtures/tags.yml invoke resource_route route resources :tags invoke scaffold_controller create app/controllers/tags_controller.rb invoke erb create app/views/tags create app/views/tags/index.html.erb create app/views/tags/edit.html.erb create app/views/tags/show.html.erb create app/views/tags/new.html.erb create app/views/tags/_form.html.erb invoke resource_route invoke test_unit create test/controllers/tags_controller_test.rb create test/system/tags_test.rb invoke helper create app/helpers/tags_helper.rb invoke test_unit invoke jbuilder create app/views/tags/index.json.jbuilder create app/views/tags/show.json.jbuilder create app/views/tags/_tag.json.jbuilder invoke assets invoke css create app/assets/stylesheets/tags.css invoke css create app/assets/stylesheets/scaffold.css
ひな形の migration ファイルを修正。中間テーブルは、意味のある名前が推奨される。今回の例ではこのテーブルの意味が乏しいので、そういうときは 複数形_複数形 が標準。
モデルクラスと、中間テーブルのクラスを作る。
外部キーを作るテーブルのモデルクラスに belongs_to
を書く。
複数のテーブルを更新するとき、途中で中断してはならないことが多い。例えば預金の間の資金移動では, 出金口座からの引き去りと、入金口座への加算の二つの処理は、all or nothing でなければならない。
こういう場合, データベースでトランザクションを掛ける。トランザクション処理 (OLTP) は, データベースへの変更を全部反映する (commit) か, すべてを取り消す (rollback) かのいずれかになることが保証される。
Rails では簡単に, ActiveRecord::Base.transaction
ブロックで囲めばよい。ブロック内で例外が発生すれば rollback され, そうでなければ commit される。なので、データベースの更新は失敗時に例外を発生させるほうのメソッドを使うようにしなければならない。
app/controllers/articles_controller.rb
トランザクションの途中の状態が, 並行して行われる別の処理から透けて見えるかどうかは、DBMS ごとに異なる。SQL 標準では, 4つのトランザクション隔離性水準 (transaction isolation level) が定義されている。PostgreSQL 13 のデフォルト隔離性水準は READ COMMITTED. MySQL 8.0 InnoDB のデフォルトは REPEATABLE READ.
今どきは、多言語化するWebアプリケーションも普通になっている。View ファイルを言語の数だけ作ればいい。これは力技。
それに加えて、submit ボタンのラベルなど、プログラムから生成するパーツについて, 短いテキストの差し替えををおこなう。
言語ごとのファイルを用意する。config/locales/ja.yml
ファイル:
ja: helpers: submit: create: "登録する" update: "更新する"
URLから locale を判定して、設定する。
app/controllers/application_controller.rb
:
クッキーを利用。[2021-09] 認証については, セキュリティホールを避けるため、適切なライブラリを使うべき. Devise は複雑すぎるので, Sorcery がおすすめ。サンプルプログラムを置いておく; LoginSample-sorcery-1 · main · netsphere / rails-examples · GitLab
Rails5 から APIモードが導入された。フロントエンドは React などの JavaScript フレームワークに任せて、バックエンドのみを提供する。Express などより Rails のほうが開発生産性が高いので、Ruby 開発者を確保できる場合、いい選択肢。
$ rails new myhelloapi --api
しばしば --api --webpack=react
のようなコマンド例を見かけるが、誤り。--webpack
オプションは, フロントエンド用で, APIモードでは単に無視される。
だいぶ様子の違う Gemfile
になる。
[2021-07追加] Basecamp 社が Hotwire をリリースした。Hotwire is an alternative approach to building modern web applications without using much JavaScript by sending HTML instead of JSON over the wire.
何でもJavaScriptで開発する風潮に対する対抗馬。
fin.