この章では、scaffold機能を使ってコードを自動生成する方法などを学んだ。
scaffoldとは
本来、Railsでアプリケーションを作成するには、モデル、コントローラー、ビュー等を作り、ルーティングも作成する必要があるが、それをコマンド一つで一括で作成してくれるのがscaffold。
試しにscaffoldを試してみると
今回は、ユーザー情報(名前、メールアドレス)の登録・更新・削除が行える画面を作ってみる。
$ rails generate scaffold User name:string email:string
invoke active_record
create db/migrate/20200122063729_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 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
invoke jbuilder
create app/views/users/index.json.jbuilder
create app/views/users/show.json.jbuilder
create app/views/users/_user.json.jbuilder
invoke test_unit
create test/system/users_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/users.coffee
invoke scss
create app/assets/stylesheets/users.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
config/routes.rb に「resources :users」が追加された事で、Railsで定義されている7つのアクションがセットで追加されていることがわかります。
$ rails routes
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
root GET /
正確に言うと、updateが2つ存在し、8つのアクションが作成されているが、PUTリクエストの方は昔の名残?か何かで実際にはPATCHが使われる。
また、7つのアクションが作成されると言ったが、usersコントローラーを見ると、7つ以上のアクションが自動で作成されているが、このcreate,update,destroyはページを出力せずベータベース上のユーザー情報の操作するだけのため。
一括で作成できたが、問題もたくさん
scaffoldコマンド一つで、ユーザーの新規登録、更新、削除が行える画面が作成できたが、この時点では下記のような問題が残っている。
- データの検証が行われていないので、空情報を登録できてしまう
- ユーザー認証が行われていないので、誰でも自由に登録や削除ができてしまう
- テストが書かれていない
- レイアウトが整っていない
scaffoldの取り消し
間違った名前などで作成してしまったなどした時の取り消し手順
$ rails destroy scaffold users
但し、これだけではデータベースにまだテーブルが残ってしまうので、マイグレーションファイルを作成する。
rails g migration users
作成したマイグレーションフィアるにusersテーブルの削除命令を書く。
class Users < ActiveRecord::Migration[5.1]
def change
drop_table :users
end
end
あとはマイグレートして無事完了
$ rails db:migrate
@記号で始まる変数
@で始まる変数をインスタンス変数と呼び、コントローラー内で宣言されたインスタンス変数はビューでも使えるようになる。
つまり、逆に@が付いていない変数はビューでは使えない。
def index
@users = User.all
end
この章で失敗したこと
試しにscaffoldしたファイル群を削除するのをしたときにusersテーブルの削除するマイグレーションファイルが残ったまま、herokuにpushしてしまい、migrateしてもエラーが出ているのを5分ぐらい気づけなかった。。