あっという間の十年ブログ【Ruby篇】

"詮ずるところ#{プログラミング}は、ただ年月長く倦まずおこたらずして、はげみつとむるぞ肝要にて、学びやうは、いかやうにてもよかるべく、さのみかかはるまじきことなり。いかほど学びかたよくても、おこたりてつとめざれば、功はなし。また、人々の才と不才とによりて、その功いたく異なれども、才不才は、生まれつきたることなれば、力に及びがたし。されど、大抵は、不才なる人といへども、おこたらずつとめだにすれば、それだけの功は有る物なり。" - 本居宣長

Rails7にBootstrapを導入するためにやったこと

  • Bootstrap 3の導入は、bootstrap-sassのREADME通りに実行すればうまくいった。
  • Bootstrap 5の導入にあたり、同じ開発者のBootstrap Ruby GemのREADME通りに実行したところ、うまくいかなかった。
    • エラー: "Your ExecJS runtime JScript isn't supported by autoprefixer-rails, please switch to Node.js (V8) or mini_racer (V8)"
    • gem mini_racerをインストールしようとするも、沼。
      • エラー: "mini_racer was resolved to 0.6.3, which depends on libv8-node"
      • ここは多くの人がハマるところらしく、
      • mini_racerのREADMEを確認すると、「Windowsはサポートしてない」とのこと。
  • 結論:Bootstrap 3で妥協する(Railsチュートリアル7版がBootstrap 3を扱っている理由もこの辺にあったりして?)

今年の目標

  1. 塾講師としての力量を上げる(仕事)
    • 実際の入試問題を毎日解く
    • とくに英語をがんばる
  2. プログラミングを続ける (はい、続けること自体が目的です。)
  3. 読書習慣を復活させる
    • 「今読んでいる本」が常に一冊はあるような状態にしておく(最近はそういう本がとくになかったので)

(以上について、アウトプット 9, インプット1くらいの割合を心がけておこなう)

とりあえず、こんなところか?(真面目すぎィ)。後で追加したり削ったりするかもです。

あと、これは目標ではないですが、アナログでできることはアナログでやるようにしたいですね。メモとか、タイマー(ポモドーロで使う)とか。目が疲れるとプログラミングを続けられなくなっちゃうので。

「Railsチュートリアルの各章が終わった状態を集めたリポジトリ」のテストが通るまで【Windows】

github.com ありがたや。 12章が終わったところから始めることにした。

ファイルを落してから最初のテストを実行できるまでに、いくつかエラーに遭遇したので、書き残しておきたい。

上記リンクのREDMEを参考に、以下を実行。

$ git clone https://github.com/yasslab/sample_apps.git
$ bundle install --without production
$ rails importmap:install turbo:install

ここまではREDMEの指示通り。

$ rails importmap:install turbo:install

を実行すると、最初のエラーが出るので、

TZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem 'tzinfo-data' to your Gemfile and run bundle install

Gemfileの一番下にある tzinfo-data gemのコメントアウトを外して、

# Windows ではタイムゾーン情報用の tzinfo-data gem を含める必要があります
# gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]

bundle installを実行。 これで先ほどの$ rails importmap:install turbo:installが通る。

続いてREDMEの指示に戻り、

$ rails db:migrate
$ rails test

を実行。$ rails testをしようとすると、RAILS_ENV=testでやる必要があると言われるので

rails db:migrate RAILS_ENV=test

をしてから、もう一度 rails test を実行。すると、二つ目のエラーが…

UNIXServer is required (LoadError)

rubygems - Rails test error " UNIXServer is required (LoadError)" on windows - Stack Overflowを参考にして、test/test_helper.rbにある

  # 指定のワーカー数でテストを並列実行する
  parallelize(workers: :number_of_processors)

parallelize(workers: :number_of_processors)をコメントアウトする。 そうすると、次のようなエラー内容に変わってくるので、

Minitest::UnexpectedError:         ActionView::Template::Error: Permission denied @ rb_file_s_rename - (C:/Users/mntbl/RENGA/tmp/cache/assets/sprockets/v4.0.0/0C/0C_d9xA9xULAYq9l2TRdD9QCBHV0CxyxKhNAvGHLuAY.cache.27160.2716.527812, C:/Users/mntbl/RENGA/tmp/cache/assets/sprockets/v4.0.0/0C/0C_d9xA9xULAYq9l2TRdD9QCBHV0CxyxKhNAvGHLuAY.cache)

今度はRuby on Rails チュートリアル Windows での実施時の困ったメモ - Qiitaを参考に、

$ rails tmp:cache:clear
$ rails assets:precompile

を実行。 これでrails testが通った!

そして、最終エラー

$ rails db:seed

からの

$ rails server
ERROR: worker mode not supported on ruby on this platform

config/puma.rbの中の

# workers ENV.fetch("WEB_CONCURRENCY") { 4 }

コメントアウトすることで、一応解決。

undefined method `session_token' for nil:NilClass

いつもの如くしこしことRailsチュートリアルやってたら、11章くらいで急に嫌~な感じのエラーが出て、半日失った。一応解決済み。

ローカルサーバーでlocalhost:3000に入ろうとしたら、以下のエラーが出た。

undefined method `session_token' for nil:NilClass

session_tokenが定義されていない…?

問題の箇所
app/helpers/sessions_helper.rb

  def current_user
    if (user_id = session[:user_id]) 
      user = User.find_by(id: user_id)
      @current_user ||= user if session[:session_token] == user.session_token
    elsif (user_id = cookies.encrypted[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

見ると、session_tokenはちゃんと定義されていたので、session_tokenのレシーバであるuserがおかしいという推測が立つ(この推測が立つまで3時間くらいかかった)。このサイト(「undefined method 〇〇 for nil:NilClass (NoMethodError) のエラーとは」)のおかげ。

問題の箇所の前にdebuggerをおいて挙動を確かめる。

      user = User.find_by(id: user_id)
      debugger
      @current_user ||= user if session[:session_token] == user.session_token

user.session_tokenは当然nilなのだが、user_idに105が代入されていた。

User.countするとデータベースに100人しかいなかったので、考えられる可能性は、

・幽霊の可能性

・パスワードをブラウザのsession(Cookie)に記憶させた後でユーザーを削除したため、ログインしているのにユーザーの実体がない(ためエラーが起きる)、という変な感じになっている。

(つまり、session[:user_id]は残っている(105番)のだが、ユーザーの実体がないので、User.find_by(id: user_id)で探しても見つからず、userがnilになってしまっている)

実際に他のブラウザ(Edge)で試したら普通に入れたので、そういうことだと思う(幽霊じゃなかった)。

ChromeCookieの削除の仕方調べとこ。

追記)ChromeからlocalhostCookie消したら入れた。

(あとは、ユーザーが存在しないにもかかわらずブラウザのcookieが残ってしまっている場合は、cookieを削除する、という処理を書いておけばいいかな~。)

Railsチュートリアル「8.2.4 メニューのトグル機能」(5版→7版)

Railsチュートリアル5版→7版への移行にあたり、8章のJavaScriptの取り扱い(「8.2.4 メニューのトグル機能」)にしたがって、Importmapを導入する。

手順通りにやってみたが、メニューがドロップダウンせず。

結局、

app/views/layouts/_header.html.erbの中身を2カ所書き換えたら、メニューを開くことができた。 htmlのidが指定されていなかったもよう。

<a href="#" class="dropdown-toggle" data-toggle="dropdown">
↓ 変更
<a href="#" id="account" class="dropdown-toggle">
<ul class="dropdown-menu">
↓ 変更
<ul id="dropdown-menu" class="dropdown-menu">

これでOK

7版ではこのあと「モバイル向け」のメニューの作成の仕方が追加されている。

さっそくRailsチュートリアル第7版(Rails7対応)を買った

1週間ぐらい前からRailsを始めて、チュートリアルの第5版(Rails5対応)を読みながらRails7の環境で恐る恐るコードを書いていましたが、13章まで行ったところでお手上げ状態でした。\(^o^)/

そして今日、第6版を買ってRails6に戻して最初からやり直すかーと思い、チュートリアルのページに行ったところ、第6版の文字が消え、第7版と書いているではありませんか。 むむむ。目を疑いました。

チュートリアルを日本語化しておられるYassLabのnoteを確認しにいくと…

rails7!
夢じゃなかった! 昨日の11時57分にはもう出ていた!

とりあえず、ここまでしこしこ書いてきたコードと、最新のチュートリアルのコードを見比べながら読んでみようかな。 デプロイは読み飛ばしていたのですが、HerokuからRenderに変わったらしいので、この際だ試してみよう。

追記:

oioi
10月1日の時点で読めてたんかーい\(^o^)/

Railsチュートリアルも終わりが見えてきたというのに…

Railsチュートリアル13章「リスト 13.54:間違ったユーザーによるマイクロポスト削除に対してテストする」で、test/controllers/microposts_controller_test.rbに

  test "should redirect destroy for wrong micropost" do
    log_in_as(users(:michael))
    micropost = microposts(:ants)
    assert_no_difference 'Micropost.count' do
      delete micropost_path(micropost)
    end
    assert_redirected_to root_url
  end

を追加すると…

ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked
            app/models/user.rb:33:in `remember'
            app/helpers/sessions_helper.rb:10:in `remember'
            app/controllers/sessions_controller.rb:10:in `create'
            test/test_helper.rb:30:in `log_in_as'
            test/integration/users_index_test.rb:11:in `block in <class:UsersIndexTest>'

こんなエラーや

ActionView::Template::Error: Asset `application.js` was not declared to be precompiled in production.
        Declare links to your assets in `app/assets/config/manifest.js`.

          //= link application.js

        and restart your server

こんなエラーがたくさん出てきて、ちょっとお手上げ状態。

やっぱりJavaScriptまわりでspocketやらimportmapをなおざりにしていたツケがここにきて…。Rails7から6にして最初からやり直すか…? いつかそうしようと思っていたことだし。

追記:
上の記事を書いている間に、なんとRailsチュートリアル第7版がリリースされてたみたい。すごいタイミングだ。(神の思し召し?)
note.com
Importmapの解説とか、デプロイ先が無料が終わりそうなHerokuからRenderに変わるそう。このビッグウェーブ、乗るしかない。