昔に勉強したけど、その後全然使ってないのでさっぱり忘れたのでまたやり直し。ちょっとまともなウェブアプリを作ってみたい。

参考にしたサイトは、Ruby on Rails 4入門 (全28回) - プログラミングならドットインストール。今はRailsのバージョンが4になっているようだ。

Railsの哲学

  • DRY (Don’t Repeat Yourself) コードの繰り返しを避ける
  • CoC (Convention over Configuration) 設定より規約

プロジェクトの生成

$ rails new <アプリケーション名> --skip-bundle
$ cd <アプリケーション名>
$ rails server  #(もしくは rails s)

→ブラウザで http://localhost:3000/ を見ると、Railsのテンプレート画面が表示される

Scaffoldでモデル作成

$ rails generate scaffold User name:string score:integer
$ rake db:migrate

http://localhost:3000/users で、ユーザの一覧画面が見れるようになる。 ユーザを追加・編集・削除できる(何も書いてないのに!)。

手動でモデル作成

scaffoldを使うとモデル・ビュー・コントローラを自動的に作ってくれるけど、個別にも作れる。

$ rails generate model Project title:string
  • generateg という短縮形でok
  • カラムのデフォルトの型が文字列なので、 :string は省略可能
  • モデルの名前は単数形で、先頭を大文字にする

使えるコマンド

$ rails db
  • .schema, select * from projects; など、SQLを使ってモデルを確認できる
$ rails console
p = Project.new(title: 'p1')
p.save

モデル作成のテストなどがインタラクティブにできる

コントローラの作成

$ rails g controller Projects
  • コントローラの名前は複数形

config/routes.rb に、

resources :projects

を足す。

$ rake routes

で、ルーティングの確認ができる

      Prefix Verb   URI Pattern                  Controller#Action
    projects GET    /projects(.:format)          projects#index
             POST   /projects(.:format)          projects#create
 new_project GET    /projects/new(.:format)      projects#new
edit_project GET    /projects/:id/edit(.:format) projects#edit
     project GET    /projects/:id(.:format)      projects#show
             PATCH  /projects/:id(.:format)      projects#update
             PUT    /projects/:id(.:format)      projects#update
             DELETE /projects/:id(.:format)      projects#destroy

コントローラのアクションを追加

  • app/controllers/projects_controller.rb に、indexメソッドを追加し、 app/views/projects/index.html.erb にビューを記述する
  • アクションでインスタンス変数(@projects)に格納すれば、ビューの中でそれにアクセスできる

ホームページの変更

routes.rbを書き換えることで、変更できる

root 'projects#index'

全体で共通のhtmlの編集

app/views/layouts/application.html.erb

<%= image_tag '画像ファイル名' %>

で画像が貼れる。画像のファイルは、app/assets/images/ に入れる。

<%= link_to 'テキスト', '/' %>

でリンクを貼れる。

projects_path, new_project_path, edit_project_path など、アクションとモデル名+_pathで、コントローラのアクションを起動するにリンクを貼れる。

プロジェクトの個別ページの表示

Projects#indexから

link_to project.title, project_path(project.id)

でリンクを貼って、Projects#showで個別ページを表示する paramsにクエリ文字列が入っていて、params[:id] でIDを取得できるので、 Project.find(id) でモデルを取得できる。

新規フォームを作ろう

form_forでフォームを生成すると、テキストフィールドなどとモデルのカラムが自動的に関連される。

<%= form_for @project do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title %>
  <%= f.submit %>
<% end %>

データを保存してみよう

Submitボタンを押したときに Projects#create に飛んでくる。

セキュリティの理由から、params[:project].permit(:title) で許可したパラメータだけを使って新しいプロジェクトを追加する。

Validationの追加とエラーメッセージの表示 modelvalidates :title, ... と条件を記述すると、コントローラから @project.save とした時に false が返るので、それを見て条件分岐をする。

削除

Projects#destroyメソッドを追加する

before_action only: で指定のアクションに対してだけ、なにか共通の動作をさせることができる

感想

今回は環境のセットアップや各ステップでも全然つまづかなかった。以前Railsのチュートリアルを試した時にはもうあらゆるところで、ウェブにある情報を試しても動かないことが多かったんだけど、そういう意味ではRailsも枯れてきたのかな?