プログラマ・アゲイン blog

還暦を過ぎたけどプログラマ復帰を目指してブログ始めました

Ruby on Railsを勉強中に遭遇した問題(5)

前回の「Ruby on Railsを勉強中に遭遇した問題(4)」の続きになります。

テキストとして使用している「Ruby on Rails 6 超入門」の、第5章「その他に覚えておきたい機能」の「ActionTextで超ミニブログを作ろう!」で遭遇したものです。

また、新しくアプリケーションを作成してトライしたため、今までの経験を踏まえた最初の環境設定からの作業もまとめてみました。

ただし、React で行った Webpacker関連は行いません。

テキストに従ってやっていくと、テキストには書かれていない問題にいろいろ遭遇しました。

ここでは、遭遇した問題について、内容と対応を記録したいと思います。

 

 

アプリケーションの作成と環境設定

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 を勉強してきて、一通りテキストを読破しました。

また経験したことが有れば、別のページに載せていきたいと思います。