Ruby on Railsチュートリアルでbcryptのエラー

Ruby on Railsチュートリアルでbcryptのエラーが出ました。環境はWindows上のMSYS2+Ruby 2.4です。

C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/bcrypt-3.1.11-x64-mingw32/lib/bcrypt.rb:16:in `require': cannot load such file -- bcrypt_ext (LoadError)

こちらのようにしたら動きました。最後の'bcrypt-ruby'を設定する方法です。

gem 'bcrypt' で起動時Error&ページアクセス時にもError

bcrypt 3.1.11でWindowsの修正が入ったという情報がありますが、なぜか動ないんですよね。

Ruby on RailsチュートリアルでUserのデータベースマイグレーション

Ruby on Railsチュートリアルで第6章のユーザーのモデルを作成しているとき、rails db:migrateしてもrails testすると、

Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test

というエラーになります。素直に、RAILS_ENVをつけてテストをすると、テストはパスします。

その後、validationでuniquenessをつけてまたmigrateしようとするとこんどは、migrateできないというエラーになります。

SQLite3::ConstraintException: UNIQUE constraint failed: users.email: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")

このときは、一度db:rollbackして、db:migrateするとうまくいきます。

test/fixtures/users.ymlを空にしてから、

rails db:rollback RAILS_ENV=test
rails db:migrate RAILS_ENV=test

チュートリアルでは、development環境で実行されているようですが、テストはtest環境で実行されているようで異なっています。

development環境とともにtest環境のデータベースも用意しないといけないようです。

Ruby on Railsチュートリアルでguardを使ったときのエラー

Ruby on Railsチュートリアルをやって、第3章の3.6.2 Guardによるテストの自動化をやったときのこと。

チュートリアル通りやっても、

No such file or directory - bin/rails test test/controllers/static_pages_controller_test.rb test/test_helper.rb

このようにファイルがないというエラーになります。調べたところ、こちらのようにGuardfileからspring: "bin/rails test"を消したら動くようになりました。

Guardfile

guard :minitest, all_on_start: false do # ここ
  watch(%r{^test/(.*)/?(.*)_test\.rb$})
  watch('test/test_helper.rb') { 'test' }
  ....
end

MSYS2+Ruby on RailsでPumaが終了できないときの対処法

MSYS2とRuby 2.4.0をこちらの情報をもとにインストールしました。

Ruby on Rails 5.1.1もインストールできました。

でも、rails serverコマンドでPumaを起動した後、Ctrl-Cで終了しようとしてもできません。プロンプトは返ってくるのですが、Pumaにシグナルが送られていなくてプロセスは起動したままになっています。こうなるとタスクマネージャーでRuby Interpreterを探してタスクを終了するしかなくなります。

対処方法として、MinttyをあきらめてWindows Consoleを使う方法と、winptyを使う方法、ConEmuを使う方法の3つがあります。

Windows Consoleを使う方法だと、lsで出力に色がついたときに、赤色と青色が暗くて読めなくなります。

winptyを使う方法だと、いちいちwinptyをつけてコマンドを実行しなくてはならず面倒です。

そこで、ConEmuを使ってみることにしました。

ConEmuは、こちらからダウンロードしてインストールします。

PATHに追加してconemu64で起動できるようにします。

次に、スタートメニューのMinGW 64-bitやMSYS2の項目を右クリックしてファイルの場所を開くでショートカットを表示します。

ショートカットのプロパティーで、-conemuを付け加えます。

C:\msys64\msys2_shell.cmd -mingw64 -conemu

これで、ConEmuが使えるようになります。

右上の三本のアイコンでsettingsを選ぶと、フォントの大きさも変えられます。また、マウスで選択することでコピーペーストもできるのでとりあえずいいかなと思っています。

ただ、irbやrails consoleで日本語が文字化けします。どうするか考え中です。

Ruby on Railsはバージョン管理が大変

Ruby on Railsチュートリアルをやり始めました。開発環境は、Ruby 2.4.0p0[x64-mingw32] + MSYS2です。

ちなみに、これまでRuby 2.4.0ではRailsがインストールできませんでした。nokogiri 1.7.2がRuby 2.3系しか対応していなかったためです。

2017/6/5になってnokogiri 1.8.0がリリースされてようやくインストールできるようになりました。

チュートリアルをやり始めてすぐエラーが出ました。

key must be 32 bytes

ということで、こちらの情報をもとにRailsを5.0.1に変更しました。

でも、これでHerokuにデプロイしてみるとH20(App boot timeout)というエラーになります。起動に時間がかかりすぎているというエラーです。

そこで、Railsのバージョンを5.0.3にしました。すると、普通に起動するようになりました。

Gemfile

gem 'Rails', '5.0.3'

また、rails testでエラーになります。こちらの情報をもとにminitestを5.10.1に指定しました。

minitestの5.10.2でtestが動作しないときに試すこと

これで、とりあえず動いています。

なんだか、少しバージョンが違っただけで動いたり動かなかったりするんですね。

このほかにも、win32consoleを入れた方がいいというメッセージが出て入れてみたりしました。rails testの時に色がつくそうです。

Herokuにデプロイしてみると、Windowsで作られたGemfile.lockは使えませんということで、作り直してくれているようです。RubyをWindowsで使うのはなかなか難しいなと思います。

Django Girls Tutorialをやり終えて

Django Girls Tutorialをやり終えました。

このTutorialの良いところは、Webアプリケーションを作る過程を一通りできることです。

作ったアプリケーションをHerokuで公開するところまで含まれていますので、簡単そうでしたが結構骨が折れました。

実際にやってみないとわからないことが多くありました。

Djangoを触ってみて一番驚いたのは、データの削除をするとき関連するデータまで削除してくれることです。

Tutorialの中で、ブログの記事とコメントを作るのですが、記事を削除すると関連する複数あったコメントまで同時に削除してくれます。データベースを見て確認しました。

自分で関連するコメントを選別して削除する必要はありませんでした。

データベースをきれいに保つには欠かせないと思います。

困った点は、Django Girls Tutorialの日本語版はバージョンが古いらしく、英語版のDjango Girls Tutorial:extensionsをやろうとすると、修正が必要だったことです。ただ、その原因を突きとめる過程で学ぶことが多くありました。

PythonでWebアプリケーションを作りたいとなったときに、Djangoを最初に学ぶには良いTutorialではないかと思います。

Django Girls Tutorial:ExtensionsでNoReverseMatchが出た時の対処法

Django Girls TutorialでDjango Girls Tutorail:ExtensionsのHomework: add more to your website!をやっていた時のこと。

Delete postという項目でpost_remove()という関数を作ってブログを削除するボタンを作りました。

でも、記事の削除はできるのですが、次のようなエラーになりブログのトップに戻りません。

NoReverseMatch at /post/24/remove/
Reverse for 'post_list' not found. 'post_list' is not a valid view function or pattern name.

実は、Django Girls Tutorial:ExtensionsはTutorial本体とはバージョンが違っていて、urls.pyの指定が間違っていました。blog/urls.pyのurlの指定のところで下のようにname='post_list'を付け加えないといけませんでした。

blog/urls.pyの変更前

urlpatterns = [
    url(r'^$', views.post_list),
]

blog/urls.pyの変更後

urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
]

views.pyファイルの中のredirect('post_list')で指定する値は、urlのnameの値になります。

nameに指定してあるから、redirectを呼んだ時urlがブログのトップページ'/'だとわかり、views.post_list関数が呼ばれます。

日本語版のTutorialをやったあとExtensionsをやっていて原因を見つけるのに時間がかかったので報告しておきます。

英語版をやっている人は問題ないです。

HerokuでGoogle Fontsを使うときはHTTPSが必要

HerokuでDjango Girls Tutorialを作ったときにGoogle Fontsを使ってみました。

ローカルではうまく表示されるのですが、Herokuへデプロイするとなぜかフォントが使われていません。

CSSでstyleを設定する前にGoogle Fontsを読み込まなければならないという情報もあり、stylesheetの読み込み順序を変えてみても、表示は変わりませんでした。なにより、ローカルで動いているのでソースコードが間違っているとは思いにくいです。結局、Herokuで使うときはHTTPSを使わないといけませんでした。

<link href="https://fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">

このように、httpsで始まるようにします。

Chromeの開発者ツールで見てみると、一番下のコンソールのところにhttpはHerokuで使えませんと出ていました。見落としていました。

Djangoで静的ファイルが見つからないときの探し方

Djangoを使っていて、CSSなどの静的ファイル(staticファイル)が見つからないときは次のようにするといいです。

css/blog.cssを探す場合、コンソールで次のように打ちます。

python manage.py findstatic --verbosity 2 css/blog.css

すると、次のように表示されます。

Found 'css/blog.css' here:
  /home/hoge/djangogirls/static/css/blog.css
Looking in the following locations:
  /home/hoge/djangogirls/static
  /home/hoge/djangogirls/myvenv/lib/python3.4/site-packages/django/contrib/admin/static

見つかるとFoundで表示してくれますし、見つからなくても探している場所を表示してくれますので確認しやすいと思います。

アプリケーションの場所のstaticディレクトリは、自動で探しにいくようです。

settings.pyのSTATICFILES_DIRでstaticファイルの場所を指定している場合など、場所の確認ができます。

仮想化やクラウドについて