Rails7にBootstrapを導入するためにやったこと
- Bootstrap 3の導入は、bootstrap-sassのREADME通りに実行すればうまくいった。
- Bootstrap 5の導入にあたり、同じ開発者のBootstrap Ruby GemのREADME通りに実行したところ、うまくいかなかった。
- 結論:Bootstrap 3で妥協する(Railsチュートリアル7版がBootstrap 3を扱っている理由もこの辺にあったりして?)
今年の目標
- 塾講師としての力量を上げる(仕事)
- 実際の入試問題を毎日解く
- とくに英語をがんばる
- プログラミングを続ける
(はい、続けること自体が目的です。)
- 今つくっているアプリを完成させる(1日 1commit)
- 基本情報技術者試験に合格する
- 読書習慣を復活させる
- 「今読んでいる本」が常に一冊はあるような状態にしておく(最近はそういう本がとくになかったので)
(以上について、アウトプット 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)で試したら普通に入れたので、そういうことだと思う(幽霊じゃなかった)。
追記)→ChromeからlocalhostのCookie消したら入れた。
(あとは、ユーザーが存在しないにもかかわらずブラウザの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を確認しにいくと… 夢じゃなかった! 昨日の11時57分にはもう出ていた!
とりあえず、ここまでしこしこ書いてきたコードと、最新のチュートリアルのコードを見比べながら読んでみようかな。 デプロイは読み飛ばしていたのですが、HerokuからRenderに変わったらしいので、この際だ試してみよう。
追記: 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に変わるそう。このビッグウェーブ、乗るしかない。