Noriyo Akita's Today I Learned

# 2024-06-15

Table of Contents

2024-06-15

久々に rails new するぞ

devcontainer で rails new してみるのがゴール

ディレクトリを作っていく

Terminal window
$ mkdir Rails
$ mkdir rails-playground
$ cd $_
$ ruby -v
$ rbenv local 3.4.0-preview1
$ git init
$ git st
$ git add -A
$ gc

v7.2.0.beta2 を使ってみる

Terminal window
bundle init
Writing new Gemfile to /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/Gemfile
$ vi Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
gem "rails", github: "rails/rails", tag: "v7.2.0.beta2"
Terminal window
$ bundle config set path 'vendor/bundle'
$ bundle install
# すでにディレクトリは作ってあるので rails new . で良いのかあ
# この時点ではまだ bundle exec
$ bundle exec rails -h
$ bundle exec rails new . -a propshaft -c tailwind -d postgresql

なんか .gitignore とGemfileが衝突しちゃったな。とりあえず Y (overwrite)

pin とか言っている。あとは foreman も入ってくれるのか。便利

Terminal window
rails importmap:install
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/importmap-rails-2.0.1/lib/install/install.rb
Add Importmap include tags in application layout
insert app/views/layouts/application.html.erb
Create application.js module as entrypoint
create app/javascript/application.js
Use vendor/javascript for downloaded pins
create vendor/javascript
create vendor/javascript/.keep
Configure importmap paths in config/importmap.rb
create config/importmap.rb
Copying binstub
create bin/importmap
run bundle install --quiet
rails turbo:install stimulus:install
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/turbo-rails-2.0.5/lib/install/turbo_with_importmap.rb
Import Turbo
append app/javascript/application.js
Pin Turbo
append config/importmap.rb
run bundle install --quiet
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/turbo-rails-2.0.5/lib/install/turbo_needs_redis.rb
Enable redis in bundle
gsub Gemfile
run bundle install --quiet
Switch development cable to use redis
gsub config/cable.yml
run bundle install --quiet
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/stimulus-rails-1.3.3/lib/install/stimulus_with_importmap.rb
Create controllers directory
create app/javascript/controllers
create app/javascript/controllers/index.js
create app/javascript/controllers/application.js
create app/javascript/controllers/hello_controller.js
Import Stimulus controllers
append app/javascript/application.js
Pin Stimulus
Appending: pin "@hotwired/stimulus", to: "stimulus.min.js"
append config/importmap.rb
Appending: pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
append config/importmap.rb
Pin all controllers
Appending: pin_all_from "app/javascript/controllers", under: "controllers"
append config/importmap.rb
run bundle install --quiet
rails tailwindcss:install
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/tailwindcss-rails-2.6.1-x86_64-darwin/lib/install/tailwindcss.rb
Add Tailwindcss include tags and container element in application layout
insert app/views/layouts/application.html.erb
insert app/views/layouts/application.html.erb
insert app/views/layouts/application.html.erb
Build into app/assets/builds
create app/assets/builds
create app/assets/builds/.keep
append .gitignore
Add default config/tailwindcss.config.js
create config/tailwind.config.js
Add default app/assets/stylesheets/application.tailwind.css
create app/assets/stylesheets/application.tailwind.css
Add default Procfile.dev
create Procfile.dev
Ensure foreman is installed
run gem install foreman from "."
Fetching foreman-0.88.1.gem
Successfully installed foreman-0.88.1
1 gem installed
Add bin/dev to start foreman
create bin/dev
Compile initial Tailwind build
run rails tailwindcss:build from "."
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.

.devcontainer/Dockerfile はこんな感じ

# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
ARG RUBY_VERSION=3.4.0.preview1
FROM ghcr.io/rails/devcontainer/images/ruby:$RUBY_VERSION
Terminal window
bin/rails -h
Usage:
bin/rails COMMAND [options]
You must specify a command. The most common commands are:
generate Generate new code (short-cut alias: "g")
console Start the Rails console (short-cut alias: "c")
server Start the Rails server (short-cut alias: "s")
test Run tests except system tests (short-cut alias: "t")
test:system Run system tests
dbconsole Start a console for the database specified in config/database.yml
(short-cut alias: "db")
plugin new Create a new Rails railtie or engine
All commands can be run with -h (or --help) for more information.
In addition to those commands, there are:
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.

ostruct が 3.5.0 でデフォルトではなくなるので Gemfile に追加するようにとの警告が出ている。とりあえず Gemfile に追加してインストール

devcontainer で Docker のパスが見つからない

https://github.com/microsoft/vscode-remote-release/issues/9105

VS Code settings Dev > Containers: Docker Path でパスを指定しておく

# これで表示されるパスを指定しておく
❯ which docker
/Users/noriyo_tcp/.docker/bin/docker

ruby 3.4.0-preview1 を使っていたせいで devcontainer がこけてしまった

3.3.3 をインストールする

❯ rbenv install 3.3.3
❯ bundle install --redownload
Fetching gem metadata from https://rubygems.org/.........
Your bundle is locked to strscan (3.1.1) from rubygems repository https://rubygems.org/ or installed locally, but that version can no longer be
found in that source. That means the author of strscan (3.1.1) has removed it. You'll need to update your bundle to a version other than strscan
(3.1.1) that hasn't been removed in order to install.
# Gemfile を削除して bundle install --redownload 再度実行
rm Gemfile.lock

.devcontainer/devcontainer.json にて

なんかコンテナ立ち上げた後の bin/setup はあるが、コンテナ内で bundle install するような記述はない
ということは rails はローカルに入れておくということなのかなやっぱり

もう一度 devcontainer を開こうとするとこんなエラーが

Error response from daemon: No such image: ghcr.io/rails/devcontainer/images/ruby:3.4.0.preview1

image の指定を修正する

.devcontainer/Dockerfile

ここでまだ 3.4.0-preview1 のほうを見ていたので修正した root の Dockerfile も

--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,3 +1,3 @@
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
-ARG RUBY_VERSION=3.4.0.preview1
+ARG RUBY_VERSION=3.3.3
diff --git a/Dockerfile b/Dockerfile
index d06233a..07b3931 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,7 +7,7 @@
# For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
-ARG RUBY_VERSION=3.4.0.preview1
+ARG RUBY_VERSION=3.3.3
FROM docker.io/library/ruby:$RUBY_VERSION-slim as base

ここまでやって Rebuild and reopen in container

volumes:
- type: bind
source: /Users/noriyo_tcp/MyPlayground/til/Rails
target: /workspaces
bind:
create_host_path: true

見てると redis, standalone-chromium, postgres などのイメージを構築している

コンテナの中でわざわざまた bundle install しているぞ?

# in container
bin/dev

立ち上がった! localhost:3000 で確認できた

# on Host
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eec507746391 rails_playground-rails-app "/bin/sh -c 'echo Co…" 7 minutes ago Up 7 minutes 0.0.0.0:45678->45678/tcp rails_playground-rails-app-1
5e8a9016951e postgres:16.1 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 5432/tcp rails_playground-postgres-1
1ef1dd24896a seleniarm/standalone-chromium "/opt/bin/entry_poin…" 7 minutes ago Up 7 minutes 4444/tcp, 5900/tcp rails_playground-selenium-1
71ee2fc88442 redis:7.2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 6379/tcp rails_playground-redis-1

一旦 Docker Desktop でサクッと止めておいた

コンテナの中だけにしたい

見た感じコンテナ内で bundle install しているようだから、ホスト側に入れておく必要はないのでは?
Remote connection とコンテナ止めておく

Terminal window
# on Host
gem list --no-versions | grep "^[a-z]" | xargs gem uninstall -aIx
rbenv exec gem list #=> rails はない
rails -h
rbenv: rails: command not found
The `rails' command exists in these Ruby versions:
2.1.1
2.2.3
2.5.3
2.7.2
2.7.3
3.0.0
3.1.2
3.2.0
# 3.3.3 には rails はない

そしてまた reopen in container する。コンテナ内ではすでに rails やその他 gem を入れてあるのですんなり動く

container で使用する拡張機能を指定する

該当する extension をタブで開いてadd devcontainers.json を押せば良い

Remote 用の設定画面で Solargraph: Use Bundler をオンにしてみた


Rals Guides の Getting Started をやっていくぞ

link_to の第2引数はパスヘルパーを使用しなくても、リソースを渡せば良いのだな?
元々そうだったっけ? https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

そうだったっぽい

<%= link_to article.title, article %>

Deleting and Article

https://guides.rubyonrails.org/getting_started.html#deleting-an-article

今では data-turbo-method, data-turbo-confirm を使うのだなあ

あとは Basic authentication を残すのみ

status を enum にして inclusion validation 使いたいな

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

# 2024-06-16

2 min read

ArticlesController でこのように Basic 認証を入れた例えば記事の新規作成ページにアクセスしようとすると Basic 認証を求められる

Read