Ruby on Railsを勉強中に遭遇した問題(5)
前回の「Ruby on Railsを勉強中に遭遇した問題(4)」の続きになります。
テキストとして使用している「Ruby on Rails 6 超入門」の、第5章「その他に覚えておきたい機能」の「ActionTextで超ミニブログを作ろう!」で遭遇したものです。
また、新しくアプリケーションを作成してトライしたため、今までの経験を踏まえた最初の環境設定からの作業もまとめてみました。
ただし、React で行った Webpacker関連は行いません。
- 価格: 3520 円
- 楽天で詳細を見る
テキストに従ってやっていくと、テキストには書かれていない問題にいろいろ遭遇しました。
ここでは、遭遇した問題について、内容と対応を記録したいと思います。
アプリケーションの作成と環境設定
rails new
rails new で新たなアプリケーションを作成します。
rails new の実行に当たっては、「-m template.rb」を指定します。
data = File.read('Gemfile')
data.sub!(/^.*gem "tzinfo-data".*$/, 'install_if(-> { RUBY_PLATFORM =~ /mingw|mswin|java/ }) { gem "tzinfo-data" }')
File.write('Gemfile', data)
c:\Data\Web_study\Rails>rails new ActionText -m template.rb create create README.md create Rakefile ・・・ Bundle complete! 15 Gemfile dependencies, 73 gems now installed. ・・・ Pin all controllers Appending: pin_all_from "app/javascript/controllers", under: "controllers" append config/importmap.rb
Gemfile の編集
Gemfile については、必要なもののみ指定した方が良いのだろうけど、何が必要になるかわからないので、今まで設定したものをすべて設定することにします。
assets scss
「cannot load such file -- sassc」を避けるために、該当の行をコメントアウトします。
# Use Sass to process CSS # gem "sassc-rails" ↓ # Use Sass to process CSS gem "sassc-rails"
devise
Devise をインストールするために、以下を追加します。
# Use Devise gem "devise"
kaminari
Kaminari をインストールするために、以下を追加します。
# Use Kaminari gem "kaminari"
bundle install
bundle install コマンドで、上記のインストールを行います。
c:\Data\Web_study\Rails\ActionText>bundle install Fetching gem metadata from https://rubygems.org/.......... Resolving dependencies... Using rake 13.0.6 Using racc 1.6.0 Using concurrent-ruby 1.1.10 Using minitest 5.16.3 Using builder 3.2.4 Using erubi 1.11.0 Using crass 1.0.6 Using rack 2.2.4 Using nio4r 2.5.8 Using websocket-extensions 0.1.5 Using bundler 2.3.24 Using marcel 1.0.2 Using mini_mime 1.1.2 Using timeout 0.3.0 Using io-console 0.5.11 Using public_suffix 5.0.0 Using bcrypt 3.1.18 Using bindex 0.8.1 Using msgpack 1.6.0 Using matrix 0.4.2 Using regexp_parser 2.6.1 Using childprocess 4.1.0 Using orm_adapter 0.5.0 Using method_source 1.0.0 Using thor 1.2.1 Using zeitwerk 2.6.6 Using ffi 1.15.5 (x64-mingw-ucrt) Using kaminari-core 1.2.2 Using rexml 3.2.5 Using rubyzip 2.3.2 Using tilt 2.0.11 Using websocket 1.2.9 Using sqlite3 1.5.3 (x64-mingw-ucrt) Using i18n 1.12.0 Using tzinfo 2.0.5 Using nokogiri 1.13.9 (x64-mingw-ucrt) Using rack-test 2.0.2 Using websocket-driver 0.7.5 Using mail 2.7.1 Using net-protocol 0.1.3 Using addressable 2.8.1 Using reline 0.3.1 Using warden 1.2.9 Using puma 5.6.5 Using sprockets 4.1.1 Using bootsnap 1.13.0 Using sassc 2.4.0 Using selenium-webdriver 4.6.1 Using activesupport 7.0.4 Using loofah 2.19.0 Using net-imap 0.3.1 Using net-pop 0.1.2 Using net-smtp 0.3.3 Using xpath 3.2.0 Using tzinfo-data 1.2022.6 Using irb 1.4.3 Using webdrivers 5.2.0 Using activemodel 7.0.4 Using rails-dom-testing 2.0.3 Using rails-html-sanitizer 1.4.3 Using globalid 1.0.0 Using capybara 3.38.0 Using debug 1.6.3 Using actionview 7.0.4 Using activejob 7.0.4 Using activerecord 7.0.4 Using actionpack 7.0.4 Using jbuilder 2.11.5 Using kaminari-actionview 1.2.2 Using kaminari-activerecord 1.2.2 Using actioncable 7.0.4 Using activestorage 7.0.4 Using actionmailer 7.0.4 Using railties 7.0.4 Using kaminari 1.2.2 Using sprockets-rails 3.4.2 Using actionmailbox 7.0.4 Using actiontext 7.0.4 Using responders 3.0.1 Using importmap-rails 1.1.5 Using sassc-rails 2.1.2 Using stimulus-rails 1.1.1 Using turbo-rails 1.3.2 Using web-console 4.2.0 Using devise 4.8.1 Using rails 7.0.4 Bundle complete! 18 Gemfile dependencies, 86 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
Action Text のインストール
出力されるメッセージが違うので、以下にログしておきます。
c:\Data\Web_study\Rails\ActionText>rails action_text:install append app/javascript/application.js append config/importmap.rb create app/assets/stylesheets/actiontext.css To use the Trix editor, you must require 'app/assets/stylesheets/actiontext.css' in your base stylesheet. create app/views/active_storage/blobs/_blob.html.erb create app/views/layouts/action_text/contents/_content.html.erb Ensure image_processing gem has been enabled so image uploads will work (remember to bundle!) gsub Gemfile rails railties:install:migrations FROM=active_storage,action_text Copied migration 20221118045155_create_active_storage_tables.active_storage.rb from active_storage Copied migration 20221118045156_create_action_text_tables.action_text.rb from action_text invoke test_unit create test/fixtures/action_text/rich_texts.yml
SQLite3 のインストール
sqlite3 は、先の bundle install 時に名前が出ていたので、何もしないで良いと思っていました。
しかし、実際にテーブル用のモデルを作成しようとすると、次のエラーになります。
c:\Data\Web_study\Rails\ActionText>rails generate model blogconfig title:text subtitle:text stylename:text Could not find gem 'image_processing (~> 1.2)' in locally installed gems. Run `bundle install` to install missing gems.
そこで、sqlite3 のインストールを行いました。
c:\Data\Web_study\Rails\ActionText>gem install sqlite3 Successfully installed sqlite3-1.5.3-x64-mingw-ucrt Parsing documentation for sqlite3-1.5.3-x64-mingw-ucrt Installing ri documentation for sqlite3-1.5.3-x64-mingw-ucrt Done installing documentation for sqlite3 after 2 seconds 1 gem installed
しかし、これだけでは、エラーになった「image_processing」はインストールされていないので、再度 bundle install します。
c:\Data\Web_study\Rails\ActionText>bundle install Fetching gem metadata from https://rubygems.org/.......... Resolving dependencies... ・・・ Fetching image_processing 1.12.2 Installing image_processing 1.12.2 Bundle complete! 19 Gemfile dependencies, 89 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
これで、モデルを作成することができました。
ActionTextアプリの実行
実際にコーディングして、アプリケーションを実行したところ、以下のようなエラーに出くわしました。
Error::EACCES in Bloggenres#index
Rails server のログにも、以下のエラーが出力されています。
ActionView::Template::Error (Permission denied @ rb_file_s_rename - (c:/Data/Web_study/Rails/ActionText/tmp/cache/assets/sprockets/v4.0.0/Xp/Xp3nXj00X31oHTBgAmi6NnQoRQsZ9ObGqgJJ2awVlR0.cache.37560.12044.646553, c:/Data/Web_study/Rails/ActionText/tmp/cache/assets/sprockets/v4.0.0/Xp/Xp3nXj00X31oHTBgAmi6NnQoRQsZ9ObGqgJJ2awVlR0.cache)): sprockets (4.1.1) lib/sprockets/path_utils.rb:362:in `rename' sprockets (4.1.1) lib/sprockets/path_utils.rb:362:in `atomic_write'
「Permission denied @ rb_file_s_rename」でググると、以下のページがヒットします。
Ruby on Rails チュートリアル Windows での実施時の困ったメモ - Qiita
ここでは、cacheファイルの再作成で対応しているようなのですが、別の方法で試してみました。
メッセージに出ている cacheファイルのプロパティから、実行しているユーザー(Authenticated Usersグループ)のセキュリティを確認してみました。
上記のように、「フル コントロール」のアクセス許可が有りません。
「編集(E)...」ボタンから、「フル コントロール」のアクセス許可を設定しました。
Rails Server を立ち上げ直して「http://localhost:3000/bloggenres」アクセスすると、Bloggenres#index の画面が表示されました。
ブログ記事が投稿されない
ジャンルは登録できたのですが、ブログ記事を作成しても保存されません。
ジャンルを登録した時には、以下のように INSERT処理が実行されています。
Started POST "/bloggenres/add" for ::1 at 2022-11-21 14:28:52 +0900 Processing by BloggenresController#add as TURBO_STREAM Parameters: {"authenticity_token"=>"[FILTERED]", "bloggenre"=>{"name"=>"infra", "memo"=>"稼働環境のジャンル"}, "commit"=>"作成"} TRANSACTION (0.1ms) begin transaction ↳ app/controllers/bloggenres_controller.rb:11:in `add' Bloggenre Create (1.3ms) INSERT INTO "bloggenres" ("name", "memo", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "infra"], ["memo", "稼働環境のジャンル"], ["created_at", "2022-11-21 05:28:52.663897"], ["updated_at", "2022-11-21 05:28:52.663897"]] ↳ app/controllers/bloggenres_controller.rb:11:in `add' TRANSACTION (5.2ms) commit transaction ↳ app/controllers/bloggenres_controller.rb:11:in `add' Redirected to http://localhost:3000/bloggenres
ところが、ブログ記事の投稿時は、以下のように TRANSACTIONが発生せず INSERT処理が行われていません。
Started POST "/blogposts/add" for ::1 at 2022-11-21 15:53:19 +0900 Processing by BlogpostsController#add as TURBO_STREAM Parameters: {"authenticity_token"=>"[FILTERED]", "blogpost"=>{"title"=>"Rubyは文字列の処理に向いている", "read"=>"Rubyを使ってみての感想(1)", "content"=>"<div>Rubyを使って実際にプログラミングしたところ、文字列処理の凄さに<strong>ビックリ</strong>した。</div>", "bloggenre_id"=>"1"}, "commit"=>"作成"} Redirected to http://localhost:3000/blogposts
エラー・メッセージが出ていないので、いろいろ調べても原因が判りません。
しかし、試していてふとした事から、間違いを見つけることができました。
間違っていたのは、models/blogpost.rb の blongs_to のコーディングで、以下のように修正しました。
belongs_to :Bloggenre ↓ belongs_to :bloggenre
小文字のところを、大文字でコーディングした為でした。
これにより、正常に INSERT処理が実行され、ブログ記事が投稿できました。
Started POST "/blogposts/add" for ::1 at 2022-11-22 17:02:28 +0900 Processing by BlogpostsController#add as TURBO_STREAM Parameters: {"authenticity_token"=>"[FILTERED]", "blogpost"=>{"title"=>"REXXはホストとPCで稼働する", "read"=>"REXXは、ホストとPCで稼働させることができる", "content"=>"<div>REXXは、<em>インタープリター言語</em>である。<br>I/O処理の部分などに違いはあるが、それ以外は同じコードを稼働させることができる。</div>", "bloggenre_id"=>"1"}, "commit"=>"作成"} TRANSACTION (0.1ms) begin transaction ↳ app/controllers/blogposts_controller.rb:12:in `add' Bloggenre Load (0.1ms) SELECT "bloggenres".* FROM "bloggenres" WHERE "bloggenres"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/blogposts_controller.rb:12:in `add' Blogpost Create (10.5ms) INSERT INTO "blogposts" ("title", "read", "content", "bloggenre_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["title", "REXXはホストとPCで稼働する"], ["read", "REXXは、ホストとPCで稼働させることができる"], ["content", nil], ["bloggenre_id", 1], ["created_at", "2022-11-22 08:02:28.649343"], ["updated_at", "2022-11-22 08:02:28.649343"]] ↳ app/controllers/blogposts_controller.rb:12:in `add' ActionText::RichText Create (0.3ms) INSERT INTO "action_text_rich_texts" ("name", "body", "record_type", "record_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["name", "content"], ["body", "<div>REXXは、<em>インタープリタ ー言語</em>である。<br>I/O処理の部分などに違いはあるが、それ以外は同じコードを稼働させることができる。</div>"], ["record_type", "Blogpost"], ["record_id", 2], ["created_at", "2022-11-22 08:02:28.665156"], ["updated_at", "2022-11-22 08:02:28.665156"]] ↳ app/controllers/blogposts_controller.rb:12:in `add' ActiveStorage::Attachment Load (0.1ms) SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = ? AND "active_storage_attachments"."record_type" = ? AND "active_storage_attachments"."name" = ? [["record_id", 2], ["record_type", "ActionText::RichText"], ["name", "embeds"]] ↳ app/controllers/blogposts_controller.rb:12:in `add' Blogpost Update (0.2ms) UPDATE "blogposts" SET "updated_at" = ? WHERE "blogposts"."id" = ? [["updated_at", "2022-11-22 08:02:28.710876"], ["id", 2]] ↳ app/controllers/blogposts_controller.rb:12:in `add' TRANSACTION (9.1ms) commit transaction ↳ app/controllers/blogposts_controller.rb:12:in `add'
理解が出来ていない状態でテキストをそのままコーディングしていると、よくやる間違いです。
でも、それを見つけるのに一苦労するので、今後も気を付けようと思います。
以上、Ruby on Rails を勉強してきて、一通りテキストを読破しました。
また経験したことが有れば、別のページに載せていきたいと思います。