はじめに
Railsを触り始めて半年ほどたちました、tonnyです。
復習もかねてRails Tutorialを実施したので、そのメモを残します。
やはり2回目でも気づくことは多いので、非常に勉強になりました。
環境について
- Mac OS X Yosemite 10.10.5
- Ruby 2.4.0
- Rails 5.0.1
Railsは先日バージョン5.0.2がリリースされたそうですね。
http://weblog.rubyonrails.org/2017/3/1/Rails-5-0-2-has-been-released/
備忘録
Rubyのアップデート
Rubyのバージョンはrbenvで管理しています。
そのため、まずはrbenvのRubyに2.4.0を追加します。
下記のサイト様を参考にさせていただきました。
rbenvをupdateして最新のRubyバージョンをインストールする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Homebrewをアップデート brew update # ruby-buildをアップデート brew upgrade ruby-build # インストール可能なrubyのバージョンを確認 rbenv install --list # Rubyの指定したバージョンをインストール rbenv install 2.4.0 # 現在rbenvに登録されているRubyのバージョンを確認 rbenv versions |
今回のプロジェクト内で2.4.0を使用したいので、まずはプロジェクトを作成します。
そしてプロジェクト内でrbenvの指定をします。
1 2 3 4 | rbenv local 2.4.0 # そのプロジェクト内のバージョンを確認 rbenv version |
ちなみに、globalを使用するとデフォルトのバージョンを変更できます。
1 | rbenv global 2.4.0 |
Guardを起動するとエラーになる
序盤でGuardによって監視しています。
ただ、以下のようなエラーが出た場合、Rubyを入れなおすことが一般的なようです。
1 2 3 4 5 | Sorry, you can't use Pry without Readline or a compatible library. Possible solutions: * Rebuild Ruby with Readline support using `--with-readline` * Use the rb-readline gem, which is a pure-Ruby port of Readline * Use the pry-coolline gem, a pure-ruby alternative to Readline |
ただ、再度ビルドせずに済む方法はないかと探していたところ(面倒だとは言ってない)、
下記のIssueに記載がありました。
https://github.com/pry/pry/issues/1579
1 2 3 4 | group :development, :test do gem 'pry' gem 'rb-readline' end |
ちなみに
Pryは対話的にRubyを実行できるツールのことです。
Rubyに標準で搭載されているirbの代替です。
https://github.com/pry/pry
readlineはコンソールなどで入力するコマンドを読み取るgemのようです。
https://github.com/ConnorAtherton/rb-readline
minitestが、個別でやると成功するのに、まとめて実行すると失敗する
どうやらSpringが悪さをしているようなので、全部killしました。
1 2 3 4 5 6 7 | $ ps ax | grep spring 17256 ?? Ss 0:05.10 spring app | sample_app | started 17 mins ago | test mode 17257 ?? Ss 0:04.83 spring app | sample_app | started 17 mins ago | development mode 14327 s000 S 0:00.71 spring server | sample_app | started 11 hours ago 19581 s000 R+ 0:00.01 grep spring $ kill -9 17256 |
Springとは
アプリケーションプリローダーのことであり、Rails4.1から導入されたそうです。
railsコマンドが実行される際に、Springサーバーが起動し、2回目以降のライブラリのロード時間を短縮してくれます。
rails console
は初回起動に時間がかかっても、2回目以降は素早くたちあがると思います。
ちなみにRails Tutorialではdev環境で使用しています。
1 2 3 4 5 6 | group :development do gem 'web-console', '>= 3.3.0' gem 'listen', '~> 3.0.5' gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end |
rails serverでポートが使用されていて失敗する
下記のようなエラーがでて、
rails server
が立ち上がりませんでした。
1 | Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE) |
3000番ポートが使用されているようなので、
lsof
で確認します。
こちらのブログ様が、用途ごとにまとめられており分かりやすかったです。
lsof:オープンしているファイルを調べる
1 2 3 4 5 6 | $ lsof -i:3000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 10476 user 34u IPv4 0xcb2946624bb2b959 0t0 TCP *:hbci (LISTEN) ruby 13241 user 34u IPv4 0xcb2946624bb2b959 0t0 TCP *:hbci (LISTEN) $ kill -9 10476 |
aタグをtarget=”_blank”にするときはrel=”noopener”をつける
これはまだよく分かっておりませんが、備忘録としてQiitaの記事を載せておきます。
http://qiita.com/memolog/items/9913b0067e4e6883ed17
開いた記事から画面操作ができてしまうことが問題のようです。
default_scopeで”order by id desc”
default_scopeは使ったことはないものの、事前知識はありました。
デフォルトの条件を指定するので、
order by id desc
と指定しておけばidの降順がデフォルトになります。
Micropostモデルにdefault_scopeで指定すると、Micropost.firstが降順で最初の1件を取得することは理解していました。
ただ、Micropost.lastが
order by id asc
になることは驚きました。
Railsの方で判断して変えてくれるのですね。
1 2 3 4 5 | class Micropost < ApplicationRecord default_scope -> { order(created_at: :desc) } end |
1 2 3 4 5 6 | >> Micropost.first Micropost Load (6.4ms) SELECT "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" DESC LIMIT ? [["LIMIT", 1]] => #<Micropost id: 301, content: "ああああ", user_id: 1, created_at: "2017-03-06 03:17:57", updated_at: "2017-03-06 03:17:57", picture: nil> >> Micropost.last Micropost Load (0.7ms) SELECT "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" ASC LIMIT ? [["LIMIT", 1]] => #<Micropost id: 1, content: "Quibusdam ut iusto neque ea quia.", user_id: 1, created_at: "2017-03-05 15:40:37", updated_at: "2017-03-05 15:40:37", picture: nil> |
herokuのファイルを確認する
heroku run bash
でUNIXコマンドを使用してherokuアプリ内のファイルを確認することができます。
1 | $ heroku run bash |
さいごに
忘れていたこと、そもそも分かった気になっていたこともあり、2回目とはいえ勉強になることが多いです。
やはりRails Tutorialは良い教材であることを再認識しました。
ログイン認証、および最終章あたりは理解が不十分な気がしているので、また時間を置いて実践したいと思います。