教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
この章では、 Rails の Scaffold を利用して、CRUD 機能を実装します。
CRUD とは Create(作成) / Read(表示) / Update(更新) / Delete(削除) の略でアプリケーションを実現するために必要十分な機能群のことを指します。
そして、Rails の Scaffold を利用することによって、その CRUD を素早く実現できるので実際に試してみましょう。
まずは、 rails new
コマンドを利用して新しいプロジェクトを作成しましょう。
任意のディレクトリ配下で下記コマンドを実行しましょう。
shell12 Copied!$ rails _5.2.3_ new snippet_app
$ cd snippet_app
(場合によっては管理者権限でコマンドを実行する sudo
を先頭につける必要があります)
次に下記のコマンドを実行しましょう。
Copied!$ bundle install
そして、 rails generate scaffold
コマンドを利用して、モデル、コントローラ、ビューをまとめて生成します。
shell1 Copied!$ bundle exec rails generate scaffold snippet title:string language:string contents:string
(場合によっては管理者権限でコマンドを実行する sudo
を先頭につける必要があります)
Rails で標準で備わっているWebアプリケーションの脆弱性の1つであるクロスサイトリクエストフォージェリ対策機能を無効化します。
Copied!config
└── environments
└── development.rb(変更前)
ruby123 Copied!# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker # この次の行に追記
Copied!config
└── environments
└── development.rb(変更後)
ruby12345 Copied!# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.action_controller.allow_forgery_protection = false
Copied!config
└── environments
└── production.rb(変更前)
ruby12 Copied!# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false # この次の行に追記
Copied!config
└── environments
└── production.rb(変更後)
ruby1234 Copied!# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
config.action_controller.allow_forgery_protection = false
(余談)mac の場合は、下記のように gsed
コマンドを利用して追記することもできます。(直接編集した場合は不要)
shell123 Copied!$ sudo gsed -i -e "/config.file_watcher = ActiveSupport::EventedFileUpdateChecker/a \\\n config.action_controller.allow_forgery_protection = false" config/environments/development.rb
$ sudo gsed -i -e "/config.active_record.dump_schema_after_migration/a \\\n config.action_controller.allow_forgery_protection = false" config/environments/production.rb
次に、データベースのマイグレーションを行います。
shell1 Copied!$ bundle exec rake db:migrate
(場合によっては管理者権限でコマンドを実行する sudo
を先頭につける必要があります)
ここまでできたら、アプリケーションが立ち上がることを確認しましょう。
shell1 Copied!$ bundle exec rails server
(場合によっては管理者権限でコマンドを実行する sudo
を先頭につける必要があります)
このコマンドを実行したら、 localhost:3000 にアクセスし、アプリのRailsのデフォルトページが起動できることを確認しましょう。Ctrl + C
で強制終了させることができます。
※ cloud9 を利用している場合は localhost:8080 がデフォルトとなるようです。
また、Terminal を開き curl
を用いて API を実行しましょう。
成功すると、DB にデータが挿入されます。
アプリを起動させながら、Terminal の新規タブを開いて実行しましょう。
shell123 Copied!$ curl -X POST -H "Content-Type: application/json" -d '{"title":"title1", "language":"Ruby", "contents":"contents1"}' localhost:3000/snippets.json
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"title2", "language":"JavaScript", "contents":"contents2"}' localhost:3000/snippets.json
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"new title", "language":"JavaScript", "contents":"new contents"}' localhost:3000/snippets.json
下記のようなレスポンスが返ってくれば成功です。
Copied!{"id":1,"title":"title1","language":"Ruby","contents":"contents1","created_at":"2019-06-22T05:37:23.186Z","updated_at":"2019-06-22T05:37:23.186Z","url":"http://localhost:3001/snippets/1.json"}
{"id":2,"title":"title2","language":"JavaScript","contents":"contents2","created_at":"2019-06-22T05:38:43.775Z","updated_at":"2019-06-22T05:38:43.775Z","url":"http://localhost:3001/snippets/2.json"}
{"id":3,"title":"new title","language":"JavaScript","contents":"new contents","created_at":"2019-06-22T05:39:43.775Z","updated_at":"2019-06-22T05:39:43.775Z","url":"http://localhost:3001/snippets/3.json"}
POST に成功していることを確かめるために、SQLite のデータを確認しましょう。
rails db
コマンドで SQLite のコマンドラインツールを起動できます。
shell1 Copied!$ bundle exec rails db
(場合によっては管理者権限でコマンドを実行する sudo
を先頭につける必要があります)
コマンドラインツールが起動できたら、以下のコマンドを入力してください。
shell1 Copied!sqlite> select * from snippets;
下記のような結果となれば、成功です。
Copied!1|title1|Ruby| contents1|2019-06-22 05:37:23.186440|2019-06-22 05:37:23.186440
2|title2|JavaScript|contents2|2019-06-22 05:38:43.775661|2019-06-22 05:38:43.775661
3|new title|JavaScript|new contents|2019-06-22 05:39:43.775661|2019-06-22 05:39:43.775661
確認ができたら、下記コマンドにて sqlite を終了させましょう。
shell1 Copied!sqlite> .exit
ここまで実行できれば、Server 側の実装は完了です。次の章に進みましょう。
bundle installをすると、An error occurred while installing puma (3.12.6), and Bundler cannot continue.
このようなエラーが出ます。
Rails 5.1・Mac OS
rails g scaffoldで必要なものを作成した際に、Snippetsコントローラーの中の各アクションの中の記述は自動的に追加されるのでしょうか?
1-1のPOST API を実行するの箇所のcurl -X POST -H "Content-Type: application/json" -d '{"title":"title1", "language":"Ruby", "contents":"contents1"}' localhost:3000/snippets.jsonを実行するとエラー発生
(7) Failed to connect to localhost port 3000: Connection refused
解決方法がわかりません。
このコマンドを実行したら、 localhost:3000/index.html にアクセスし、アプリのRailsのデフォルトページが起動できることを確認しましょう。Ctrl + C で強制終了させることができます。
このコマンドを実行したら、 localhost:3000 にアクセスし、アプリのRailsのデフォルトページが起動できることを確認しましょう。Ctrl + C で強制終了させることができます。