LoginSignup
0
0

More than 1 year has passed since last update.

Ruby on Rails チュートリアル第2章をやってみて 

Last updated at Posted at 2022-02-07

Toyアプリケーション

■第2章
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってアプリケーションを作成する。それを元に、RailsプログラミングとWebプログラミングの概要を学んでいくそう。

2.1 アプリケーションの計画

まず、Toyアプリケーションをどのようなものにするか計画立てをする。

Railsのバージョン指定をして、アプリケーションの骨組み作成から始める。

$ cd ~/environment
$ rails _5.1.6_ new toy_app
$ cd toy_app/

その後はGemfileの中身を書き換えて、本番用のgemを除いたローカルgemをインストールする。

$ bundle install --without production

IDEでのRailsのバージョンと、Gemfileでのバージョンが違っていたせいでうまくできなかったです。自分でエラーが解決できるとなんか嬉しいですね。

最後に、GitでこのToyアプリケーションをバージョン管理下に置きます。

$ git init
$ git add -A
$ git commit -m "Initialize repository"

次に、Bitbucketで新しいリポジトリの作成。生成したファイルをプッシュする。

$ git remote add origin git@bitbucket.org:<username>/toy_app.git
$ git push -u origin --all

続いてアプリケーションコントローラに以下のコードを追加

def hello
    render html: "hello, world!"
  end

ルートルーティングを設定

Rails.application.routes.draw do
  root 'application#hello'
end

ファイルを変更したら、herokuにプッシュ。

$ git commit -am "Add hello"
$ heroku create
$ git push heroku master
# 省略
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
# 省略

こんな感じのエラーが出たので、以下のサイトを参照しました。
Herokuへpushしたら"Detected sqlite3 gem which is not supported on Heroku"になったので、Gemfile直したけど、反映されないやつ

2.1.1 ユーザーのモデル設計

ユーザーには
・重複のない一意のキーとなるinteger型のID番号 (id)
・一般公開されるstring型の名前 (name)
・string型のメールアドレス (email)
の3つ持たせる。

2.1.2 マイクロポストのモデル設計

マイクロポストのデータモデルは
・integer型のid
・マイクロポストのテキスト内容を格納するtext型のcontent
・投稿者を記録するためのuser_id

2.2 Usersリソース

ユーザー用のデータモデルのデータ表示のため、Webインターフェイスに従って実装する。これらが組み合わさるとUserリソースになる。このUsersリソースはscaffoldジェネレータで生成する。

$ rails generate scaffold User name:string email:string
$ rails db:migrate

idパラメータはRailsによって自動的に主キーとしてデータベースに追加されます。

2.2.1 ユーザーページを探検する

サーバーを立ち上げて

$ rails server

以下を表示すれば、色々なページが表示されるようになります。
・/users すべてのユーザーを一覧するページ
・/users/1 id=1のユーザーを表示するページ
・/users/new 新規ユーザーを作成するページ
・/users/1/edit id=1のユーザーを編集するページ

/usersを見てみるとこんな感じに
スクリーンショット 2022-02-07 16.29.08.png

2.2.2 MVCの挙動

1章でも説明されたMVCモデルの挙動を、今回のアプリケーションに適用した説明がある。割愛。

ここで、「/」にアクセスしたらHello Wordldではなくて、ユーザー一覧を表示するようにルーティングを変更する。

変更前 root 'application#hello'
変更後 root 'users#index'

変更後にアクセスしたら、ユーザー一覧が表示されました。

2.2.3 Usersリソースの欠点

scaffoldの問題点は
・データの検証が行われておらず、でたらめなデータでも通ってしまう。
・ユーザー認証がなく、誰でも無制限に操作できる。
・テストが十分に書かれてなく、必要な要求を満たしていない。
・レイアウトやスタイルが整っていない。
・理解が困難
などが挙げられる。

2.3 Micropostsリソース

ユーザーの扱いをUsersで学んだので、投稿を扱うMicropostsの理解をする。

2.3.1 マイクロポストを探検する

Micropostsリソースもscaffoldでコード生成。
rails generate scaffoldコマンドを使ってモデルの実装をする。

$ rails generate scaffold Micropost content:text user_id:integer
$ rails db:migrate

2.2と同様にデータベースの更新も行う。
そうすると、routes.rbに resources :microposts が追加された。

こんな感じでできました。
スクリーンショット 2022-02-07 19.48.17.png

2.3.2 マイクロポストをマイクロにする

バリデーション(validation)を使って文字数制限を与える。
app/models/micropost.rbに以下のコードを記述

validates :content, length: { maximum: 140 }

ちゃんとエラーになりました。
スクリーンショット 2022-02-07 19.50.53.png

2.3.3 ユーザーはたくさんマイクロポストを持っている

1人のユーザーに対し複数のマイクロポストがあるとする。
UserモデルとMicropostモデルを更新。

app/models/user.rbに次の記述を追加。

has_many :microposts

1つのマイクロポストは1人のユーザーにのみ属する場合
app/models/micropost.rbに次の記述を追加。

belongs_to :user

2.3.4 継承の階層

Javaやってた時にもあったような、クラスの継承の話が出てきました。
いろんな言語触っておいて損はないんだなーと実感。

2.3.5アプリケーションをデプロイする

Bitbucketに登録。

$ git status
$ git add -A
$ git commit -m "Finish toy app"
$ git push
$ git push heroku
$ heroku run rails db:migrate

感想

慣れてきたのか、1章よりもスムーズにやることができました。
より高度MVCモデルもなんとなく理解できた気がします。
Scaffold機能でコードを自動生成して、モデルデータにアクセスしてやりとりするところは、応用情報の時のデータベースで見たような話もあって面白かったです。

疑問・単語集

・bundle installとは bundlerを使ってGemfileからgemをインストールするコマンドのこと

・REST REpresentational State Transferの略。インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築する、アーキテクチャスタイルの一種。

・rails console rails の環境を読み込んだ状態でrubyコードを実行できるツール

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0