Ruby on Rails 4 の簡単なチュートリアルをやってみた。
Learn Web Development with the Ruby on Rails Tutorial | A Demo App
英語だけどわりと読みやすいし図もあるのでそっちを見たほうが良いと思う。とりあえず自分用にメモしておく。
Learnin Web Development とあるだけあって単に Ruby on Rails だけでなく、github と git の使い方や heroku へのデプロイまで解説しているので Web 開発そのもののチュートリアルとなっているのが大変良いですね。
Contents
rails アプリ作成
bundle コマンドから rails を呼び出す。
$ bundle exec rails new demo_app $ cd demo_app
Gemfile の中を確認
source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.0.0.beta1' gem 'sqlite3' # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails', '~> 4.0.0.beta1' gem 'coffee-rails', '~> 4.0.0.beta1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes gem 'therubyracer', platforms: :ruby gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails' # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 1.0.1' # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' # Use unicorn as the app server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano', group: :development # To use debugger # gem 'debugger'
必要な物をインストールする
$ bundle install
model の作成
user の作成
users テーブルは以下のような構成にする
id:integer
name:string
email:string
$ bundle exec rails generate scaffold User name:string email:string --skip-bundle invoke active_record create db/migrate/20130422125716_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml invoke resource_route route resources :users invoke jbuilder_scaffold_controller create app/controllers/users_controller.rb invoke erb create app/views/users create app/views/users/index.html.erb create app/views/users/edit.html.erb create app/views/users/show.html.erb create app/views/users/new.html.erb create app/views/users/_form.html.erb invoke test_unit create test/controllers/users_controller_test.rb invoke helper create app/helpers/users_helper.rb invoke test_unit create test/helpers/users_helper_test.rb invoke jbuilder exist app/views/users create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/users.js.coffee invoke scss create app/assets/stylesheets/users.css.scss invoke scss create app/assets/stylesheets/scaffolds.css.scss
いろいろ作成されたり編集されたりする。id は指定してないけど勝手に追加される。
model 作ったら db を migrate する。
$ bundle exec rake db:migrate == CreateUsers: migrating ==================================================== -- create_table(:users) -> 0.0041s == CreateUsers: migrated (0.0043s) ===========================================
これで table が作成されたはず。以下のコマンドでサーバを起動して見てみる。
$ bundle exec rails server
http://localhost:3000/ にアクセスすると rails デフォルトの画面が表示される。
サーバが動いていれば /users , /users/new へアクセスできるはず。
現時点では users に対して以下の操作ができる。
GET /users 全てのユーザを表示 GET /users/1 ID1のユーザを表示 GET /users/new ユーザ新規作成画面 POST /users ユーザ新規作成 GET /users/1/edit ID1のユーザを編集 PATCH /users/1 ID1のユーザを更新 DELETE /users/1 ID1のユーザを消去
削除は /users に delete があるので押すと JavaScript 経由で行う事ができる。
Rails の MVC
- ブラウザは /users URL をリクエストする
- Rails が /users の index アクションを呼ぶ
- index アクションが User モデルから全てのユーザ(User.all)を取得
- User モデルがデータベースから users を取得
- User モデルが users リストをコントローラに返す
- コントローラが @users 変数に users をいれ、index ビューに渡す
- ビューは embedded Ruby を HTML として表示する
- コントローラは HTML をブラウザに返す
Rails のルートは config/routes.rb にある
以下のように users が定義されている。
DemoApp::Application.routes.draw do resources :users
Users コントローラは app/controllers/users_controller.rb にある。
内容は以下のようにクラスが一個とメソッドがいろいろ定義してある。
class UsersController < ApplicationController before_action :set_user, only: [:show, :edit, :update, :destroy] # GET /users # GET /users.json def index @users = User.all end # GET /users/1 # GET /users/1.json def show end ... end
Users モデルは app/models/user.rb にある。
中身はほとんど無い。
class User < ActiveRecord::Base end
User index ビューは app/views/users/index.html.erb にある。
中はHTMLとか
<h1>Listing users</h1> <table> <thead> <tr> <th>Name</th> <th>Email</th> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <% @users.each do |user| %> <tr> <td><%= user.name %></td> <td><%= user.email %></td> <td><%= link_to 'Show', user %></td> <td><%= link_to 'Edit', edit_user_path(user) %></td> <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br /> <%= link_to 'New User', new_user_path %>
これがページ分ある。
現時点での Users の問題点
- バリデーションが無い
- 認証が無い
- テストが無い
- レイアウトが無い
- 理解したとは言えない
micropost
microposts テーブルは以下のようにする
id:integer
content:string
user_id:integer
users と同じように rails generate scaffold で作成
$ bundle exec rails generate scaffold Micropost content:string user_id:integer --skip-bundle invoke active_record create db/migrate/20130423032101_create_microposts.rb create app/models/micropost.rb invoke test_unit create test/models/micropost_test.rb create test/fixtures/microposts.yml invoke resource_route route resources :microposts invoke jbuilder_scaffold_controller create app/controllers/microposts_controller.rb invoke erb create app/views/microposts create app/views/microposts/index.html.erb create app/views/microposts/edit.html.erb create app/views/microposts/show.html.erb create app/views/microposts/new.html.erb create app/views/microposts/_form.html.erb invoke test_unit create test/controllers/microposts_controller_test.rb invoke helper create app/helpers/microposts_helper.rb invoke test_unit create test/helpers/microposts_helper_test.rb invoke jbuilder exist app/views/microposts create app/views/microposts/index.json.jbuilder create app/views/microposts/show.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/microposts.js.coffee invoke scss create app/assets/stylesheets/microposts.css.scss invoke scss identical app/assets/stylesheets/scaffolds.css.scss [/source] データベースをアップデートするために migrate を実行する。 $ bundle exec rake db:migrate == CreateMicroposts: migrating =============================================== -- create_table(:microposts) -> 0.0125s == CreateMicroposts: migrated (0.0127s) ======================================
config/routes.rb に microposts が追加されているのが確認できる。
DemoApp::Application.routes.draw do resources :microposts resources :users
Microposts が提供する RESTfull route
GET /microposts 全ての投稿を表示 GET /microposts/1 ID1の投稿を表示 GET /microposts/new 投稿新規作成画面 POST /microposts 投稿する GET /microposts/1/edit ID1の投稿を編集する PATCH /microposts/1 ID1の投稿を更新する DELETE /microposts/1 ID1の投稿を削除する
Microposts コントローラは Users 同様 app/controllers/microposts_controller.rb にある。
class MicropostsController < ApplicationController before_action :set_micropost, only: [:show, :edit, :update, :destroy] # GET /microposts # GET /microposts.json def index @microposts = Micropost.all end ... end
Microposts に文字数制限を追加する。
microposts モデル ( app/models/micropost.rb ) を編集する
class Micropost < ActiveRecord::Base validates :content, length: { maximum: 140 } end
テーブル同士の関連付け
microposts と users テーブルを関連付けさせます。
モデルを以下のように編集します。
class User < ActiveRecord::Base< has_many :microposts< end<
class Micropost < ActiveRecord::Base belongs_to :user validates :content, length: { maximum: 140 } end
rails コンソールから関連付けを確認してみる。
$ bundle exec rails console Loading development environment (Rails 4.0.0.beta1) irb(main):001:0> first_user = User.first User Load (0.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 => #<User id: 3, name: "hoge1", email: "hoge@example.com", created_at: "2013-04-22 13:19:05", updated_at: "2013-04-22 13:19:05"> irb(main):004:0> first_user.microposts Micropost Load (6.0ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? [["user_id", 3]] => #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 2, content: "hoge fuga piyo", user_id: 3, created_at: "2013-04-23 04:51:06", updated_at: "2013-04-23 04:51:06">]>
問題点
- カスタムレイアウトとスタイルがない
- 静的なページが無い
- ユーザにパスワードが無い
- ユーザに画像が無い
- サインインがない
- セキュアでない
- userとmicropostsの自動関連付けが無い
- フォローやフォロワーの観念が無い
- feedが無い
- TDDでない
- 理解したとはいえない
ほとんど Ruby のコード書いてないけど自動であれこれ作成されて楽できますね。ruby あんまり知らないんですけどね。
コメント